проблема наследования шаблона gcc - PullRequest
3 голосов
/ 29 января 2011
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? Спасибо!

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Попробуйте:

typename TBase<T>::TItem item;

Эта ссылка содержит объяснение: http://pages.cs.wisc.edu/~driscoll/typename.html

0 голосов
/ 02 февраля 2011

TItem - это тип, поэтому вам нужно ключевое слово typename. значение поля. Компилятор правильно разрешает значение, но нужно сказать, что TItem на самом деле является типом.

...