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

Constructor with extra template argument

本文关键字:参数 构造函数      更新时间:2023-10-16

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

  • 是否可以显式指定构造函数的模板参数?
  • 类模板中的模板构造函数 - 如何为第二个参数显式指定模板参数?

我想要一个模板类,它在构造函数中执行一些不平凡的事情,具体取决于另一种模板类型。一个最小的例子是这里:

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对构造函数的影响?还是我必须将其附加到整个班级?

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

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

魔杖盒上的现场示例