假设我们有一个班级,MyParent:
class MyParent
{
public:
template<namespace T>
MyParent()
{
T* Something;
}
};
派生类,它使用这个构造函数:
class MyDerived : public MyParent
{
public:
MyDerived()
: MyParent<int>()
{
}
};
然后我得到一个编译错误,因为它有歧义。编译器认为 int 是类的模板参数,而不是构造函数。
如何指定我希望 int 成为构造函数的参数?
答案 0 :(得分:4)
这是不可能的。从标准部分14.8.1显式模板参数,它注意到:
[注意:因为显式模板参数列表遵循函数模板名称,并且因为转换成员函数模板和构造函数成员函数模板在不使用 函数名称,无法为这些函数模板提供显式模板参数列表。 ]
如评论中所述,您需要让构造函数采用类型为T
(或const T &
)的参数,然后让MyDerived
调用MyParent::MyParent
int
类型的参数。
答案 1 :(得分:4)
请注意,您的问题并非特定于继承。鉴于您的代码示例,您根本无法实例化MyParent
,因为它不接受模板参数列表,或者因为它没有默认构造函数。
为了使用构造函数模板实例化MyParent
,您需要为编译器提供一些知道模板参数的方法,而不能使用无参数构造函数。你需要给MyParent
的构造函数一个参数。以下是基于code from Alf P. Steinbach的示例:
template <typename T>
struct UseMethodsOf {};
class MyParent
{
public:
template <typename T>
MyParent(UseMethodsOf<T>)
{
T* Something;
}
};
class MyDerived: public MyParent
{
public:
MyDerived()
: MyParent(UseMethodsOf<int>())
{
}
};