我正在尝试这样做,但是,我收到了一个错误, “无效的基类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;
}
答案 0 :(得分:1)
Typename
不是有效的C ++关键字,typename
是。类似Class
与class
不同。
请注意,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;
}
为纳瓦兹的利益而编辑。