我有一个包含两个以上模板的类。现在,方法必须专门用于其中两个模板。作为一个最小的例子,我在一个类的方法中计算两个数的乘积并采用实际部分。数字应该是复数或双数。但该课程总共有三个模板。以下是此代码:
#include <complex>
#include <cmath>
template<typename T1, typename T2, typename T3>
class A{
public:
A(T1 const & a_, T2 const & b_, T3 const & c_);
double multiply_and_real();
private:
T1 const & a;
T2 const & b;
T3 const & c;
};
template<typename T3>
class A: public A<double,double,T3> {};
template<typename T1, typename T2, typename T3>
A<T1,T2,T3>::A(T1 const & a_, T2 const & b_, T3 const & c_):
a(a_),
b(b_),
c(c_)
{}
template<typename T3>
double A<double,double,T3>::multiply_and_real(){
return a*b;
}
template<typename T3>
double A<std::complex<double>,double,T3>::multiply_and_real(){
return a.real()*b;
}
template<typename T3>
double A<double,std::complex<double,T3> >::multiply_and_real(){
return a*b.real();
}
template<typename T3>
double A<std::complex<double,T3>,std::complex<double> >::multiply_and_real(){
return a.real()*b.real();
}
template class A< double, double,double >;
template class A< std::complex<double>, double ,double >;
template class A< double,std::complex<double> ,double >;
template class A< std::complex<double>,std::complex<double> ,double >;
template class A< double, double,std::complex<double> >;
template class A< std::complex<double>, double ,std::complex<double> >;
template class A< double,std::complex<double> ,std::complex<double> >;
template class A< std::complex<double>,std::complex<double> ,std::complex<double> >;
int main(){
return 0;
}
错误是这样的:
main3.cpp:19:7: error: redeclared with 1 template parameter
class A: public A<double,double,T3> {};
main3.cpp:5:7: note: previous declaration ‘template<class T1, class T2, class T3> class
A’ used 3 template parameters class A{
我也试着用以下方式直接指定类:
template<typename T3> class A< double, double,T3>;
template<typename T3> class A< std::complex<double>, double ,T3>;
template<typename T3> class A< double,std::complex<double> ,T3 >;
template<typename T3> class A< std::complex<double>,std::complex<double> ,T3 >;
但这仍然会给出“重新声明”错误。
答案 0 :(得分:0)
错误来自第19行,您可以在其中定义带有一个模板参数的新模板类A,该模板参数从具有三个参数的模板类A继承。这个新类不能与旧类相同,这就是编译器抱怨的原因。
如果您的真实应用程序具有与此类似的结构,您可以通过定义一个简单的函数来保存一些代码,例如
template <typename T>
double real_part(T a) {
return 0;
}
template <>
double real_part(double a) {
return a;
}
template <>
double real_part(std::complex<double> a) {
return a.real();
}
然后您根本不需要指定不同版本的multiply_and_real。您可以将其定义为
template<T1, T2, T3>
double A<T1, T2, T3> >::multiply_and_real() {
return real_part(a) * real_part(b);
}