2010-04-29 7 views
6

Próbuję użyć zmiennych członkiem matrycy klasy podstawowej w klasie pochodnej, jak w poniższym przykładzie:Korzystanie zmienne składowe dziedziczone z matrycy klasy bazowej (C++)

template <class dtype> 
struct A { 
    int x; 
}; 

template <class dtype> 
struct B : public A<dtype> { 
    void test() { 
     int id1 = this->x;  // always works 
     int id2 = A<dtype>::x; // always works 
     int id3 = B::x;   // always works 
     int id4 = x;   // fails in gcc & clang, works in icc and xlc 
    } 
}; 

gcc i brzęk są zarówno bardzo wrażliwe na używanie tej zmiennej i wymagają albo wyraźnego zakresu, albo wyraźnego użycia "tego". W przypadku niektórych innych kompilatorów (xlc i icc) rzeczy działają tak, jak bym się spodziewał. Czy jest to przypadek xlc i icc zezwalający na kod, który nie jest standardem, czy błąd w gcc i clang?

+1

Podobne pytanie: http://stackoverflow.com/questions/11405/gcc-problem-using-a-ember--base-class-that-depends-on-a-template-argument –

Odpowiedz

5

Prawdopodobnie kompilujesz w trybie nie ścisłym w ICC. W każdym razie, ponieważ x jest niekwalifikowane, nie powinno być wyszukiwane w żadnych klasach bazowych, które zależą od parametrów szablonu. Tak więc w twoim kodzie nie ma miejsca, gdzie znaleziono kod x, a Twój kod jest nieprawidłowy.

Pozostałe nazwy są wyszukiwane przy użyciu innej metody wyszukiwania (wyszukiwanie przynależności do klasy i wyszukiwanie kwalifikowane). Obie te formy będą analizować zależne klasy bazowe, jeśli mogą (tj. Jeśli są zależne i są w ten sposób sprawdzane podczas tworzenia instancji szablonu, gdy znana jest nazwa - wszystkie inne nazwy są zależne od parametrów szablonu).

Nawet GCC w ich najnowszych wersjach nie implementuje tego poprawnie, a niektóre nazwy zależne still resolve against dependent bases podczas niewykwalifikowanego wyszukiwania.

Powiązane problemy