带有额外模板参数的构造函数

时间:2017-02-27 16:59:22

标签: c++ templates

这个问题似乎与以下内容密切相关,但我还没有完全理解它。

我想要一个模板类,它在构造函数中执行一些非常重要的操作,具体取决于另一种模板类型。这里有一个最小的例子:

template <typename A>
class Class {
  public:
    template <typename B>
    Class();

  private:
    int i;
};

template <typename A, typename B>
Class<A>::Class() {
    B b;

    i = b.get_number();
}

不能用GCC编译:

$ env LC_ALL=C g++ --std=c++11 -c template.cpp 
template.cpp:14:1: error: prototype for 'Class<A>::Class()' does not match any in class 'Class<A>'
 Class<A>::Class() {
 ^~~~~~~~
template.cpp:7:5: error: candidate is: template<class A> template<class B> Class<A>::Class()
     Class();
     ^~~~~

使用Clang进行编译会产生其他错误:

$ env LC_ALL=C clang++ --std=c++11 -c template.cpp 
template.cpp:13:1: error: too many template parameters in template redeclaration
template <typename A, typename B>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
template.cpp:3:1: note: previous template declaration is here
template <typename A>
^~~~~~~~~~~~~~~~~~~~~
1 error generated.

当我将模板参数B附加到整个类时,我可以将其编译。

template <typename A, typename B>
class Class {
  public:
    Class();

  private:
    int i;
};

template <typename A, typename B>
Class<A, B>::Class() {
    B b;

    i = b.get_number();
}

有没有办法控制模板参数B对构造函数的影响?或者我是否必须将它附加到全班?

1 个答案:

答案 0 :(得分:3)

template类中template方法的类外定义的正确语法如下:

template <typename A> // Class template parameters
template <typename B> // Method template parameters
Class<A>::Class() { 
//   ^^^
//   Class template parameters

    // ...
}

live example on wandbox