2017-03-07 42 views
2
namespace Foo { 
    class Bar { }; 
} 

namespace Foo { 
    namespace Foo { 
    class FooFooClass { 
     public: 
     void do_stuff(Bar& key); 
    }; 
    } 
} 

using namespace Foo::Foo; 

void FooFooClass::do_stuff(Bar& key) { 

} 

前述片段編譯XCode中,但在Visual Studio中不編譯(關於失敗第三至最後一行與'Bar': undeclared identifier)哪一個更正確根據C++標準。我假設clang是以專有的非標準跟蹤方式推斷Bar的正確命名空間?Xcode推斷命名空間?

+0

GCC 7.0.1也有它的工作,所以它可能是MSVC的錯。 – user975989

回答

2

鐺是正確的,由於在標準的晦澀但有用的規則([basic.lookup.qual]/3):

在聲明,其中說明符-ID合格代碼,在合格代碼被聲明爲 之前使用的名稱在定義的命名空間範圍中查找;在成員的類或名稱空間的範圍 中查找限定標識後面的名稱。

也就是說,只要編譯器看到的是,實體被定義,FooFooClass::do_stuff,是一個類的成員,它看起來了所有下列名稱中的FooFooClass範圍了上述聲明。這意味着查找Bar首先查找Foo::Foo::FooFooClass的成員,然後是Foo::Foo的成員,然後是Foo的成員,然後是全局範圍。由於在Foo中找到Bar,所以名稱查找成功。