在test.cpp文件中,我有:
template <typename T>
class A
{
public:
A(int a){};
virtual ~A();
private:
};
class B : public A<int>
{
public:
B(int a):A(a){};
virtual ~B();
private:
};
int main()
{
return 0;
}
当我编译它时,我得到了这个:
jason@jason-linux:~/Documents/ECLibrary$ g++ -g -Wall -Wextra -pedantic-errors test.cpp -o tdriver
test.cpp: In constructor ‘B::B(int)’:
test.cpp:14: error: class ‘B’ does not have any field named ‘A’
test.cpp:14: error: no matching function for call to ‘A<int>::A()’
test.cpp:5: note: candidates are: A<T>::A(int) [with T = int]
test.cpp:3: note: A<int>::A(const A<int>&)
我不想要我的基类的默认构造函数,因为它在我的代码中没有意义。我只是希望我的派生类执行基类的被调用构造函数,并为派生类中的额外内容做一些额外的构造。当我试图显式调用备用构造函数时,我真的不确定它为什么要尝试调用基类的默认构造函数。我在这里错过了什么吗?
由于
答案 0 :(得分:9)
您可以将模板参数列表添加到A
:
B(int a) : A<int>(a) { }
请注意,您使用A
而不使用模板参数列表的代码是有效的C ++。 Comeau和Visual C ++ 2010都按原样接受代码。
g ++ 4.3不接受没有模板参数列表的代码。也许有人可以测试更高版本的g ++或检查g ++ bug数据库以查看它是否是一个已知问题(我不经常使用g ++并且不熟悉他们的bug数据库)。
答案 1 :(得分:3)
请尝试B(int a):A<int>(a){}
。
答案 2 :(得分:0)
需要阅读:
class B : public A<int>
{
public:
B(int a):A<int>(a){};
virtual ~B();
private:
};
它会正常工作。
答案 3 :(得分:-1)
您正尝试将基类初始化为A
,但不是源自A
,而是源自A<int>
答案 4 :(得分:-1)
我猜你试图对整数进行A类的显式特化。
猜猜应该写成template<> Class A<int>
......