2011-01-28 20 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はそれをコンパイルすることはできません。なぜなら、テンプレートを扱うのに2回使用するからです。 VCまたはBCBは未知のテンプレート名を気にしません。 gccのこの機能を抑制する方法はありますか?ありがとうございました! http://pages.cs.wisc.edu/~driscoll/typename.htmlgccテンプレートの継承問題

+0

なぜfuncに 'this->'を使わないのですか?もう一方は 'struct TBase :: TItem'でなければなりません – mathk

答えて

4

はでそれを試してみてください。値はフィールドです。コンパイラは値を正しく解決しますが、TItemが実際に型であることを伝える必要があります。

0

TItemあなたは型名キーワードを必要とするので、タイプ:このリンクは説明を提供

typename TBase<T>::TItem item;