我有一个模板化的类,当模板参数与类的类型相同时需要专门的构造函数。下面的代码将无法编译。
当类型为Dual时,指定使用特定构造函数的正确语法是什么?特别是,当模板参数是Dual类型时,我需要在初始化列表中初始化成员'real',但是当它不是时,我需要初始化成员'real'(例如,类型为double)。
template<class X> class Dual {
public:
X real;
size_t N;
std::vector<X> imag;//don't know N at compile time
Dual(size_t _N);
};
template <class X>
inline Dual<X>::Dual(size_t _N): N(_N), imag(N, 0.0) {}
template <class X>
inline Dual<Dual<X> >::Dual(size_t _N): real(_N), N(_N), imag(_N, 0.0) {}
//syntax error:
//error: cpptest.cpp:20:24: error: C++ requires a type specifier for all declarations
//inline Dual<Dual<X> >::Dual(size_t _N): real(_N), N(_N), imag(_N, 0.0) {}
//~~~~~~
int main(){
Dual <double> a(5);
Dual< Dual < double>> b(5);
}
答案 0 :(得分:1)
您可以为构造函数提供可选的第二个参数来初始化real
。
template<class X> class Dual {
public:
X real;
size_t N;
std::vector<X> imag;
Dual(size_t _N, X x = X());
};
template <class X>
inline Dual<X>::Dual(size_t _N, X x): real(x), N(_N), imag(N, 0.0) {}
现在,当你拥有特殊的Dual
时,你可以通过传入“原型”来按照你想要的方式初始化它。
Dual<double> a(5);
Dual< Dual<double> > b(5, a);
优点是您只需声明一个template
。但是,如果您为Dual< Dual<X> >
创建专门化,那么您可以像尝试一样定义构造函数(除了imag
初始化错误,并在下面更正)。
// Specialize Dual<T> in the case T is a Dual<X>
template <class X> class Dual< Dual<X> > {
public:
Dual<X> real;
size_t N;
std::vector< Dual<X> > imag;
Dual(size_t _N);
};
template <class X>
inline Dual< Dual<X> >::Dual(size_t _N)
: real(_N), N(_N), imag(N, Dual<X>(_N)) {}
答案 1 :(得分:0)
您无法提供非类型模板的部分特化,其中包括您的构造函数。