如何访问struct/class范围内声明的别名?

jte*_*erm 1 c++ c++11

使用以下代码

Header.h

namespace some_name {
    struct foo {
        // using alias
        using MyMap = std::map<double, some_class* const>;
        MyMap* GetMap();
        MyMap* map_;
    }
}
Run Code Online (Sandbox Code Playgroud)

Source.cpp

#include "Header.h"

// using declaration
using some_name::foo;

MyMap* foo::GetMap(){
    ...
    return map_;
}
Run Code Online (Sandbox Code Playgroud)

当我编译时,我得到一个编译器错误,指出:

错误:'MyMap'没有命名类型

MyMap*foo :: GetMap(){

^

但是,如果我GetMap()在头文件中定义一切正常,但如果我将它移动到源文件,我会得到该错误.我在这里错过了什么?

Nat*_*ica 5

这条线

using some_name::foo;
Run Code Online (Sandbox Code Playgroud)

在您的代码中,只需将名称foo导入当前范围即可.这意味着只要编译器看到不合格的名称,foo它就知道你正在使用它some_name::foo.

但这对你没有帮助MyMap. MyMap是的作用域,foo以便访问你仍然需要使用foo::喜欢

foo::MyMap* foo::GetMap()
Run Code Online (Sandbox Code Playgroud)

另一种选择是添加另一个using语句来引入MyMap但是这将使用该名称污染范围,因此您可能不想这样做.如果你这样做,你可以使用

// using declaration
using some_name::foo;
using MyMap = some_name::foo::MyMap;

MyMap* foo::GetMap(){
    ...
    return map_;
}
Run Code Online (Sandbox Code Playgroud)