C ++参数化构造函数在模板化类中

时间:2015-05-31 07:20:12

标签: c++ templates constructor

我最近开始用C ++学习模板,我不确定是否需要在实现参数化构造函数时包含template <class T>

  template <class T>
  class A
  {    T num;

    //default constructor (parameterized)

    template <class T>//getting error
    A(T value)
    { num=value;}
  } 

我得到一个错误阴影模板parm&lt; T类&gt;当我为构造函数包含template<class T>时。但是当我将它注释掉时它会起作用。

我想知道为什么我不需要为构造函数声明模板。

1 个答案:

答案 0 :(得分:2)

如果您确定需要模板化构造函数,请为模板使用不同的参数名称:

template <class T>
  class A
  {   
    T num;

    //default constructor (parameterized)

    template <class U>
                 // ^
    A(U value)
   // ^
    { num=value;}
  };

否则,用于模板化构造函数的模板参数名T将隐藏类模板声明中使用的名称。

正如您在评论中提出的那样&#34;使用模板化构造函数的场合是什么?&#34;

适用于像

这样的案件
A<double> a(0.1f);

注意以上只是一个简单的例子,并不需要模板化的构造函数。它只是为了演示模板化构造函数用于从与实例化中使用的类型不同的类型进行转换。

  

&#34;我想知道为什么我不需要为构造函数声明模板。&#34;

没有(或带有额外的)非模板化构造函数的模板类只会使用为参数类型指定为类模板参数的T

template <class T>
  class A
  {   
    T num;

    A(T value)
   // ^
    { num=value;}
  };

这是标准情况,大多数模板类不需要模板化构造函数或其他模板化函数。