2011-01-28 123 views
3
template<class T> 
class TBase 
{ 
public: 
typedef int Int; 

struct TItem 
{ 
    T Data; 
}; 

int value; 
}; 

template<class T> 
class TClass:public TBase<T> 
{ 
public: 
TBase<T>::TItem item; // error here. only when using type defined in base class. 

void func() 
{ 
    TBase<T>::value ++; // no error here! 
} 
}; 

int main(int argc, char *argv[]) 
{ 
TClass<int> obj; 
return 0; 
} 

在VC和Borland C++編譯器中,它們都可以編譯它。但gcc無法編譯它,因爲它使用了兩次來處理模板事情。 VC或BCB不關心未知的模板名稱。有什麼辦法可以抑制gcc的這個功能嗎?謝謝!gcc模板繼承問題

typename TBase<T>::TItem item; 

此鏈接提供了一個解釋:http://pages.cs.wisc.edu/~driscoll/typename.html

+0

爲什麼不使用'this->'作爲函數。對於另一個它應該是'struct TBase :: TItem' – mathk

回答

4

與嘗試。價值是一個領域。編譯器正確地解析了值,但需要知道TItem實際上是一種類型。

0

TItem是一種類型,所以你需要typename關鍵字