具有两个以上模板的类的方法的部分规范

时间:2014-11-21 10:46:18

标签: class templates methods overloading specifications

我有一个包含两个以上模板的类。现在,方法必须专门用于其中两个模板。作为一个最小的例子,我在一个类的方法中计算两个数的乘积并采用实际部分。数字应该是复数或双数。但该课程总共有三个模板。以下是此代码:

#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 >;

但这仍然会给出“重新声明”错误。

1 个答案:

答案 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);
}