使用以下代码
Header.h
namespace some_name {
struct foo {
// using alias
using MyMap = std::map<double, some_class* const>;
MyMap* GetMap();
MyMap* map_;
}
}
Source.cpp
#include "Header.h"
// using declaration
using some_name::foo;
MyMap* foo::GetMap(){
...
return map_;
}
当我编译时,我收到一个编译错误,指出:
错误:'MyMap'没有命名类型
MyMap * foo :: GetMap(){
^
但是,如果我在头文件中定义GetMap()
一切正常,但如果我将其移动到源文件,我会收到该错误。我在这里缺少什么?
答案 0 :(得分:5)
该行
using some_name::foo;
在您的代码中,只需将名称foo
导入当前范围即可。这意味着只要编译器看到非限定名称foo
,它就会知道您正在使用some_name::foo
。
但这对MyMap
无效。 MyMap
的范围是foo
,因此要访问您仍需要使用foo::
foo::MyMap* foo::GetMap()
另一种选择是添加另一个using语句来引入MyMap
,但这会污染具有该名称的范围,因此您可能不希望这样做。如果你这样做,你可以使用
// using declaration
using some_name::foo;
using MyMap = some_name::foo::MyMap;
MyMap* foo::GetMap(){
...
return map_;
}
答案 1 :(得分:4)
foo::MyMap*
auto foo::GetMap()->MyMap*
(尾随返回类型)(自c++11
)您只能访问foo::MyMap
范围内的struct foo
第二个版本的工作没有合格,因为->MyMap*
部分被考虑在函数的范围内