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

时间:2016-09-30 14:35:43

标签: c++ c++11

使用以下代码

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()一切正常,但如果我将其移动到源文件,我会收到该错误。我在这里缺少什么?

2 个答案:

答案 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*部分被考虑在函数的范围内