2010-05-01 22 views
5

Aşağıdaki kod derlenmiyor. Bir hata iletisi alıyorum: hata C2039: 'Asub': 'C' üyesi değilCRTP ve typedef kullanan "Inherited" tipleri

Birisi bunu anlamama yardımcı olabilir mi?

VS2008 & 2010 derleyicisinden çalıştı.

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

You should * daima p derleme hataları ile satır numaralarını rovide. – abelenky

+0

Örnekte yapısal A nedir? – AlwaysLearning

cevap

7

Burada derleyici biraz haksız ediliyor - B<C> işlerken B<C> tamamen bilinen olmadan C yarım ve C hala tamamlanmamış bir türüdür. comp.lang.c++.moderated ve comp.lang.c++'da benzer konular vardır.

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

Ya açıkça yukarı türlerini geçirerek soruna olabilir:

template<class T, class Asub> struct B { /* ... */ }; 
class C : B<C, int> { /* ... */ }; 
Eğer üye işlev tanımı taşıyarak kullanımını geciktiren eğer örneğin çalıştığını

Not

... ya da daha fazla geçmesi gerekiyorsa bazı özellikleri sınıfa taşıyarak:

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;  
};