2

假设我们有一个类 MyParent:

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

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

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

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

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

4

2 回答 2

4

这不可能。从标准部分 14.8.1 显式模板参数中,它指出:

[注意:因为显式模板实参列表跟在函数模板名之后,并且因为转换成员函数模板和构造函数成员函数模板是在不使用函数名的情况下调用的,所以无法为这些函数模板提供显式模板实参列表。]

如评论中所述,您需要让构造函数采用T(或const T &)类型的参数,然后使用类型参数进行MyDerived调用。MyParent::MyParentint

于 2009-01-08T19:49:58.023 回答
4

请注意,您的问题并非特定于继承。鉴于您的代码示例,您根本无法实例化MyParent,要么是因为它不接受模板参数列表,要么是因为它没有默认构造函数。

为了MyParent使用构造函数模板进行实例化,您需要为编译器提供一些知道模板参数的方法,而使用无参数构造函数则无法做到这一点。你需要给MyParent's 的构造函数一个参数。这是一个基于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>())
  {
  }
};
于 2009-01-08T19:53:04.867 回答