2016-05-04 7 views
3

は、このような単純な例を検討し、関数の引数リストで名前空間を使用して使用するか、ではない:void Boo::f(Foo)で、Fooタイプについて が、VC++-2015レポートエラーをはC++:

namespace foo { 
    struct Foo {}; 
    struct Boo { 
     void f(Foo); 
    }; 
} 

using foo::Boo; 

void Boo::f(Foo) 
{ 

} 

clanggccエラーが発生することなく、このようなコードをコンパイル(-pedantic-std=c++11を) - Foo未定義の識別子。 void Boo::f(foo::Foo)それがうまくコンパイルが、何面白い、それはまた、このようなリライト後にコンパイルされます:

namespace foo { 
    struct Foo {}; 
    struct Boo { 
     void f(Foo); 
    }; 
} 

void foo::Boo::f(Foo) 
{ 

} 

はそれがc++11標準に従ってVC++2015バグでしょうか?このような場合は書き換えコード

答えて

3

いいえ、これはMSVCバグではありません。あなたは、あなたの識別子を適切に名前を付けるべきです。

+0

しかし、なぜ 'vC++'が '正しく名前空間'なしで最後の変種を受け入れるのですか?そして、 'gcc'と' clang'バグは、 'pedantic'でそのようなコードを受け入れるからです。 – fghj

+0

'Boo :: f()'が 'namespace foo'にあるので、最後の変種はOKです。そのため、その引数型は同じ名前空間で検索されます。 GCCとClangについては、バグだとは思わないが、受け入れる必要がないコードを受け入れるだけだ。ペダンティックモードが完璧であるとは期待できません。そうではありません。 –

+0

関数がユーザー定義の名前空間のメンバーである関数の定義で使用される名前の場合、名前が使用されるブロックが名前の使用前に検索され、その囲みブロックはその開始前に検索されますブロックhttp://en.cppreference.com/w/cpp/language/unqualified_lookup – fghj