这个问题似乎与以下内容密切相关,但我还没有完全理解它。
我想要一个模板类,它在构造函数中做一些重要的事情,这取决于另一个模板类型。一个最小的例子是这里:
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();
}
Run Code Online (Sandbox Code Playgroud)
这不能用 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();
^~~~~
Run Code Online (Sandbox Code Playgroud)
使用 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.
Run Code Online (Sandbox Code Playgroud)
当我将模板参数附加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();
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以包含模板参数B对构造函数的影响?还是我必须将它附加到整个班级?
类中方法的类外定义的正确语法如下:templatetemplate
template <typename A> // Class template parameters
template <typename B> // Method template parameters
Class<A>::Class() {
// ^^^
// Class template parameters
// ...
}
Run Code Online (Sandbox Code Playgroud)