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

时间:2009-01-08 19:07:48

标签: c++ templates constructor

假设我们有一个班级,MyParent:

class MyParent
{
public:
  template<namespace T>
  MyParent()
  {
    T* Something;
  }
};

派生类,它使用这个构造函数:

class MyDerived : public MyParent
{
public:
  MyDerived()
  : MyParent<int>()
  {
  }
};

然后我得到一个编译错误,因为它有歧义。编译器认为 int 是类的模板参数,而不是构造函数。

如何指定我希望 int 成为构造函数的参数?

2 个答案:

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