Недопустимая ошибка базового класса T - PullRequest
0 голосов
/ 23 мая 2011

Я пытаюсь сделать что-то подобное, но я получаю сообщение об ошибке, "Недопустимый базовый класс T". Насколько нам известно, базовый класс будет создан с именем типа T во время компиляции, а я получу определение T во время компиляции. Я попытался заменить "Typename" на "Class", но я получаю ту же ошибку. Есть идеи ?

template <typename T>  
class Base  
{ 
  private:  
  class A : public T{};

};


// It works when I do the following in main ...  

class A{}  
Base* B = new Base<A> B;  

// It throws error, when I pass in int,double,float,   
//makes sense,because these are basic data types ...  

Base* B = new Base<int> B;  


// Neil's Snippet with the error reproduced ...  

#include <iostream>
using namespace std;  

template <typename T>  
class Base  
{  
 public :
 Base::Base(int a)  
 {  
   A a;
 }
 private:  
 class A : public T{};
};  

Base <int> b;  

int main(){  
cout << &b << endl;  
}

Ответы [ 4 ]

1 голос
/ 23 мая 2011

В этом у вас есть несколько основных синтаксических ошибок, которые вызывают у вас горе: Typename должно быть typename, и после внутреннего определения класса вам нужно использовать точку с запятой, так что это прекрасно компилируется:

template <typename T>  
class Base  
{ 
  private:  
  class A :  public T{};

};
1 голос
/ 23 мая 2011

Следующий код должен компилироваться:

template <typename T>  
//        ^ lower case
class Base  
{ 
  private:  
  class A : public T {}; // < lost ;

  A a; // do you use class A in this way ?
};

Обратите внимание, что T должен быть полным типом в точке мгновенного действия.Сбой следующего:

class some; // incomplete type
Base<some> a;
1 голос
/ 23 мая 2011

Typename не является допустимым ключевым словом C ++, typename является.Симилары Class отличаются от class.

Обратите внимание, что C ++ чувствителен к регистру.Кроме того, в вашем коде отсутствует точка с запятой.

class A : public T{}; // missing semicolon here
0 голосов
/ 23 мая 2011

Это компилируется:

#include <iostream>
using namespace std;

template <typename T>  
class Base  
{ 
  private:  
  class A : public T{};

};

Base <int> b;

int main(){
    cout << &b << endl;
}

Отредактировано в пользу Наваз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...