ネストされたネームスペースとテンプレートクラスを含む問題があります。実際のコードと同じエラーを生成するテストケースを作成することもできましたが、もう少し読みやすいです。 2010プラットフォームツールセットでVS2012を使用して、次のコードをコンパイルネストされた名前空間とあいまいなシンボル
は、エラーが発生します。
namespace A
{
namespace B
{
namespace C1
{
struct SMeasResult{};
}
namespace C2
{
struct SMeasResult{};
}
}
}
namespace C1Test
{
using namespace A::B::C1;
template<typename T>
class Fook
{
public:
void Yu()
{
SMeasResult Field;
}
};
}
namespace C2Test
{
using namespace A::B::C2;
template<typename T>
class Fook
{
public:
void Yu()
{
SMeasResult Field;
}
};
}
void m(){
C1Test::Fook<int> yu;
C2Test::Fook<int> me;
yu.Yu();
me.Yu();
}
次のように特定のエラーは、次のとおりです。
1>------ Build started: Project: MultiVicomTest (Visual Studio 2010), Configuration: Debug Win32 ------
1> test.cpp
1>c:\code\test.cpp(27): warning C4101: 'Field' : unreferenced local variable
1> c:\code\test.cpp(26) : while compiling class template member function 'void C1Test::Fook<T>::Yu(void)'
1> with
1> [
1> T=int
1> ]
1> c:\code\test.cpp(49) : see reference to class template instantiation 'C1Test::Fook<T>' being compiled
1> with
1> [
1> T=int
1> ]
1>c:\code\test.cpp(43): error C2872: 'SMeasResult' : ambiguous symbol
1> could be 'c:\code\test.cpp(11) : A::B::C2::SMeasResult'
1> or 'c:\code\test.cpp(7) : A::B::C1::SMeasResult'
1> c:\code\test.cpp(42) : while compiling class template member function 'void C2Test::Fook<T>::Yu(void)'
1> with
1> [
1> T=int
1> ]
1> c:\code\test.cpp(50) : see reference to class template instantiation 'C2Test::Fook<T>' being compiled
1> with
1> [
1> T=int
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
なぜシンボル私は理解していない「SMeasResult」別の名前空間で使用されるため、コンパイラにあいまいです。 これまでにわかったことは、クラスがテンプレートクラスである場合にのみこの問題が発生することです。テンプレート定義を削除しても同じ問題は発生しません。
私は何か間違ったことを誰かに教えてもらえますか?
私はこれがバグだと確信しています。 Gccとclangはこれをうまくコンパイルして、どうしてそれがあいまいであるのかわかりません。 – jrok
MSVCは、C++ 98以来、言語標準で規定されているように、テンプレートで使用される名前の2段階ルックアップを実装していません。このバグはその可能性が最も高いです。 – Casey