2016-09-30 45 views
1

用下面的代碼如何訪問在struct/class範圍內聲明的別名?

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_; 
} 

當我編譯我得到指明瞭編譯器錯誤:

error: ‘MyMap’ does not name a type

MyMap* foo::GetMap() {

^

但是,如果我在頭文件中定義了GetMap()事情工作正常,但如果我把它移動到源文件,我得到的錯誤。我在這裏錯過了什麼?

+0

只使用作品命名空間,而不是結構。 –

+0

@BaummitAugen [Erm什麼?](http://coliru.stacked-crooked.com/a/5516cd1c40886d9b) – Borgleader

+4

@Borgleader不是我的意思,但我承認我措辭不佳。我的意思是說'using'不能將名字從'struct'拖到名字空間。 –

回答

6

using some_name::foo; 

在你的代碼只是進口的名字foo到當前範圍。這意味着,只要編譯器看到非限定名稱foo,它就會知道您使用的是some_name::foo

雖然這不會幫助您MyMapMyMapfoo所以爲了訪問你仍然需要使用foo::

foo::MyMap* foo::GetMap() 

另一種選擇則是另一種使用語句MyMap帶來加範圍的,但這會污染與該名稱的範圍,所以你可能不想要這樣做。如果你這樣做,那麼你可以使用

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

MyMap* foo::GetMap(){ 
    ... 
    return map_; 
} 
3
  • foo::MyMap*
  • auto foo::GetMap()->MyMap*(後返回類型)(因爲c++11

你只能struct foo的範圍

內訪問foo::MyMap第二個版本的工作不勝任,因爲->MyMap*部分在功能範圍內考慮


+0

可能值得用關於追蹤返回類型的解釋來限定您的答案 –

+0

我選擇了其它答案B/C它是第一個並且有更多投票,但是我很感謝您指出追蹤返回類型選項。 – jterm

+0

@jterm感謝評論:)順便說一句,這首先是因爲它有更多的選票。 (而且我的回答實際上有點快) –