2010-05-01 71 views
5

以下代碼不能編譯。 我收到一條錯誤消息:錯誤C2039:'Asub':不是'C'的成員使用CRTP和typedef的「繼承」類型

有人可以幫我理解嗎?

試過VS2008 & 2010編譯器。

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

你應該始終* * p收集編譯錯誤的行號。 – abelenky 2010-05-01 05:12:47

+0

這個例子中的struct A是什麼? – AlwaysLearning 2016-09-28 10:14:34

回答

7

您現在的位置有點不公平了這裏的編譯器 - C是不完整B<C>充分了解和處理B<C>時,C仍然是一個不完整的類型。在comp.lang.c++.moderatedcomp.lang.c++上也有類似的線程。

需要注意的是,如果你通過移動它變成一個成員函數定義耽誤使用的作品,如:

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

你可以解決的問題,通過任何經過類型明確向上:

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

...或將它們移到一些traits類,如果你需要傳遞更多:

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