无效的基类T错误

时间:2011-05-23 06:48:14

标签: c++ templates

我正在尝试这样做,但是,我收到了一个错误, “无效的基类T”。 据我们的理解,Base类将在编译时使用Type name T进行实例化,我将在编译时获得T的定义。我尝试用“Class”替换“Typename”,但我仍然得到同样的错误。有任何想法吗 ?

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 个答案:

答案 0 :(得分:1)

Typename不是有效的C ++关键字,typename是。类似Classclass不同。

请注意,C ++区分大小写。 除此之外,你的代码中缺少一个分号。

class A : public T{}; // missing semicolon here

答案 1 :(得分:1)

以下代码应该编译:

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;

答案 2 :(得分:1)

你有一些基本的语法错误导致你悲伤: Typename应该是typename,并且在内部类定义之后需要一个半冒号,因此这完全编译:

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

};

答案 3 :(得分:0)

编译:

#include <iostream>
using namespace std;

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

};

Base <int> b;

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

为纳瓦兹的利益而编辑。