2010-05-01 13 views
5

Poniższy kod nie jest kompilowany. Pojawia się komunikat o błędzie: błąd C2039: "Asub": nie jest członkiem "C""Dziedziczone" typy przy użyciu CRTP i typedef

Czy ktoś może mi pomóc to zrozumieć?

Wypróbowany VS2008 & 2010 kompilator.

template <class T> 
class B 
{ 
    typedef int Asub; 

public: 
void DoSomething(typename T::Asub it) 
{ 

} 
}; 

class C : public B<C> 
{ 
public: 
typedef int Asub; 

}; 

class A 
{ 
public: 
typedef int Asub; 

}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
C theThing; 
theThing.DoSomething(C::Asub()); 

return 0; 
} 
+1

powinieneś zawsze * p * liczby linii rovide z błędami kompilacji. – abelenky

+0

Co to jest "struct A" dla przykładu? – AlwaysLearning

Odpowiedz

7

Zostaniesz nieco niesprawiedliwe kompilatora tutaj - C jest niekompletna bez B<C> pełni znane i podczas przetwarzania B<C>, C jest nadal niekompletna typu. Istnieją podobne wątki na comp.lang.c++.moderated i comp.lang.c++.

Zauważ, że to działa, jeśli opóźnienie korzystania przesuwając go w definicji funkcji składowej, np:

struct C : B<C> { 
    void f() { typedef typename C::Asub Asub; } 
}; 

Można obejść ten problem, albo przechodząc typy wyraźnie w górę:

template<class T, class Asub> struct B { /* ... */ }; 
class C : B<C, int> { /* ... */ }; 

... lub przenosząc je do jakiejś klasy cechami jeśli trzeba przejść więcej:

template<class T, class Traits> struct B { 
    void DoSomething(typename Traits::Asub it) {} 
}; 

struct CTraits { 
    typedef int Asub; 
}; 

struct C : B<C, CTraits> { 
    typedef CTraits::Asub Asub;  
}; 
Powiązane problemy