Mam problem, który involes zagnieżdżone przestrzenie nazw i klasy szablonów. Udało mi się również stworzyć przypadek testowy, który powoduje ten sam błąd, co rzeczywisty kod, ale jest bardziej czytelny.Zagnieżdżone przestrzenie nazw i niejednoznaczny symbol
Kompilacja następujący kod przy użyciu VS2012 z platformą toolset 2010 powoduje błąd:
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();
}
Specyficzny błędu jest następująca:
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 ==========
Nie rozumiem dlaczego symbol 'SMeasResult' byłby niejednoznaczny dla kompilatora, ponieważ jest używany w oddzielnej przestrzeni nazw. Do tej pory mogłem się dowiedzieć, że problem ten pojawia się tylko wtedy, gdy zajęcia są klasami szablonowymi. Ten sam problem nie pojawia się, gdy definicja szablonu zostanie usunięta.
Czy ktoś może mi powiedzieć, czy zrobiłem coś nie tak?
Jestem prawie pewien, że to błąd. Gcc i clang kompilują to dobrze i nie rozumiem, dlaczego byłaby ona niejednoznaczna. – jrok
MSVC nigdy nie zaimplementowało dwufazowego wyszukiwania nazw używanych w szablonach zgodnie z normami językowymi od C++ 98. Ten błąd jest najprawdopodobniej jego następstwem. – Casey