我有父类
template <class T_ENUM>
class A
{
public:
A(int*);
~A();
}
现在当我创建派生类时,是否允许在父类上初始化模板?
enum Benum {e1, e2, e3};
class B : public A<Benum >
{
public:
B(int* a):A(a);
~B();
}
我得到以下编译错误
对“B :: B(int *)”
的未定义引用
在另一个文件中,其中包含类defenition头文件。
答案 0 :(得分:3)
B(int * a):A(a);
这会产生编译错误。
相反,构造函数应该实现为:
B(int* a) : A(a) {}
编辑:
您可能还想制作单个参数构造函数explicit
。例如:
class B
{
public:
explicit B(int* a);
};
这可以防止从int*
到B
的隐式类型转换。
MCVE代码:
#include <iostream>
enum Benum
{
e1,
e2,
e3
};
template<class T_ENUM>
class A
{
public:
explicit A(int*)
{
std::cout << "A ctor" << std::endl;
}
virtual ~A()
{
}
};
class B : public A<Benum>
{
public:
explicit B(int* a) : A(a)
{
std::cout << "B ctor" << std::endl;
}
~B()
{
}
};
int main()
{
int x = 3;
B b(&x);
return 0;
}
MCVE输出:
A ctor
B ctor