C++ 从具有模板构造函数的非模板类继承-如何解决歧义?
假设我们有一个类,MyParent:C++ 从具有模板构造函数的非模板类继承-如何解决歧义?,c++,templates,constructor,C++,Templates,Constructor,假设我们有一个类,MyParent: class MyParent { public: template<namespace T> MyParent() { T* Something; } }; 类MyParent { 公众: 模板 我的父母() { 某物; } }; 以及使用此构造函数的派生类: class MyDerived : public MyParent { public: MyDerived() : MyParent<int>
class MyParent
{
public:
template<namespace T>
MyParent()
{
T* Something;
}
};
类MyParent
{
公众:
模板
我的父母()
{
某物;
}
};
以及使用此构造函数的派生类:
class MyDerived : public MyParent
{
public:
MyDerived()
: MyParent<int>()
{
}
};
class MyDerived:public MyParent
{
公众:
MyDerived()
:MyParent()
{
}
};
然后我得到一个编译错误,因为有歧义。编译器认为int是类的模板参数,而不是构造函数
如何指定希望int作为构造函数的参数?这是不可能的。从标准第14.8.1节显式模板参数中,它指出: [注意:因为显式模板参数列表紧跟在函数模板名称之后,并且因为转换成员函数模板和构造函数成员函数模板是在不使用 函数名,无法为这些函数模板提供显式模板参数列表。]
如注释中所述,您需要让构造函数获取类型为
T
(或const T&
)的参数,然后使用类型为int
的参数调用MyDerived
调用MyParent::MyParent
。给定您的代码示例,您根本无法实例化MyParent
,这可能是因为它不接受模板参数列表,也可能是因为它没有默认构造函数
为了使用构造函数模板实例化MyParent
,您需要为编译器提供一些了解模板参数的方法,而使用无参数构造函数则无法做到这一点。您需要为MyParent的构造函数提供一个参数。以下是一个基于以下内容的示例:
模板
{}的结构使用方法;
类MyParent
{
公众:
模板
MyParent(使用方法)
{
某物;
}
};
类MyDerivated:公共MyParent
{
公众:
MyDerived()
:MyParent(使用方法())
{
}
};
在构造函数的实现中不需要隐藏吗?类型为t的构造函数不应该有参数吗?不需要。但是如果有,事情就会变得容易。你是说模板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>())
{
}
};