Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从具有模板构造函数的非模板类继承-如何解决歧义?_C++_Templates_Constructor - Fatal编程技术网

C++ 从具有模板构造函数的非模板类继承-如何解决歧义?

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>

假设我们有一个类,MyParent:

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>())
  {
  }
};