Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++_C++11 - Fatal编程技术网

C++ 如何定义通用模板签名

C++ 如何定义通用模板签名,c++,c++11,C++,C++11,我有两个类,其中函数是复制和粘贴。这些类之间唯一的区别是每个类继承一个类。这些超类具有相同的调用签名,但构造函数不同 我试着做一些事情,比如: template<class BaseClass> class IGenericPart : public BaseClass { public: int commonCall1() { return 10; } int commonCall2() { return 44; } }; class A : public IGener

我有两个类,其中函数是复制和粘贴。这些类之间唯一的区别是每个类继承一个类。这些超类具有相同的调用签名,但构造函数不同

我试着做一些事情,比如:

template<class BaseClass>
class IGenericPart : public BaseClass {
 public:
  int commonCall1() { return 10; }
  int commonCall2() { return 44; }
};

class A : public IGenericPart<RealBaseClass1> {
 public:
  A(int x) : IGenericPart<RealBaseClass1> (x, b) {}
};

class B : public IGenericPart<RealBaseClass2> {
 public:
  B(string z) : IGenericPart<RealBaseClass2> (z, anothertype2, anothertype2) {}
};
模板
类IGenericPart:公共基类{
公众:
int commonCall1(){return 10;}
int commonCall2(){return 44;}
};
A级:公共iGeneric部分{
公众:
A(intx):IGenericPart(x,b){}
};
B类:公共IGenericPart{
公众:
B(字符串z):IGenericPart(z,其他类型2,其他类型2){}
};
但是我不知道如何使
IGenericPart
类具有基于泛型
BaseClass
的正向构造函数。
因此基本上,我需要
IGenericPart
IGenericPart
具有不同的构造函数。

您只是缺少一个
使用
声明

当类
IGenericPart
BaseClass
继承时,它不会自动从
BaseClass
继承构造函数。要继承构造函数,必须使用
声明显式地执行此操作,如下所示:

template<class BaseClass>
class IGenericPart : public BaseClass {
 public:
  using BaseClass::BaseClass;
  // etc ...
};
模板
类IGenericPart:公共基类{
公众:
使用BaseClass::BaseClass;
//等等。。。
};
然后为
IGenericPart
创建构造函数,这些构造函数与
BaseClass
的每个构造函数对应并转发给它们,因此
A
B
的初始化列表将按预期工作


请注意,构造函数继承是C++11的一项功能,因此您必须在C++11模式下使用支持C++11的编译器进行编译,才能使其正常工作。

如果出于某种原因无法使用C++11,您可以通过向IGenericPart添加以下笨拙的位来使其正常工作:

template<class BaseClass>
class IGenericPart: public BaseClass {
  public:
    template <typename A>
    IGenericPart(A a) : BaseClass(a) {}

    template <typename A, typename B>
    IGenericPart(A a, B b) : BaseClass(a, b) {}

    template <typename A, typename B, typename C>
    IGenericPart(A a, B b, C c) : BaseClass(a, b, c) {}
}
模板
类IGenericPart:公共基类{
公众:
模板
IGenericPart(A):基类(A){}
模板
IGenericPart(A,B):基类(A,B){}
模板
IGenericPart(A,B,C C):基类(A,B,C){
}

RealBaseClass 1/2
是否源自
基类
?顺便说一句,您的
BaseClass
IGenericPart
的父类,因此您应该能够在
IGenericPart
的构造函数中调用它的构造函数作为
IGenericPart():BaseClass(参数){…}
。这就是你想要的吗?如果
IGenericPart()
也收到了参数,我只能执行IGenericPart():基类(参数)。让我编辑以使ir更清楚地表明构造函数实际上是不同的。答案是:没有,我的问题不同,我想让
IGenericPart
IGenericPart
具有不同的构造函数签名。@TylerMcHenry,请删除重复项或解释在该问题中回答的原因。这太棒了!我真的错过了使用关键字的
。谢谢!