使用模板重载成员函数

时间:2014-11-20 19:23:51

标签: c++ class templates overloading

当我有一个带模板的类时,我怎么能实现,依赖于dataypes,我可以计算......具有某种成员功能。 我构建了一个最小的例子,其目标是乘以两个数字,这些数字可以是实数也可以是复数,而不仅仅是它的实部:Re {a * b}。

这是头文件test.hpp:

ifndef __TEST_H__
#define __TEST_H__

template<typename T1, typename T2>
class A{
    public:
        A(T1 const & a_, T2 const & b_);

     double multiply_and_real();

    private:

    T1 const & a;
    T2 const & b;
};

#endif /* __TEST_H__ */

这是cpp文件,test.cpp:

#include "test.hpp"
#include <complex>
#include <cmath>

template<typename T1, typename T2>
A<T1,T2>::A(T1 const & a_, T2 const & b_):
    a(a_),
    b(b_)
    {}

template<typename T1, typename T2>
double A<double,double>::multiply_and_real(){

    return a*b;
}

template<typename T1, typename T2>
double A<std::complex<double>,double>::multiply_and_real(){

    return a.real()*b;
}

template<typename T1, typename T2>
double A<double,std::complex<double> >::multiply_and_real(){

    return a*b.real();
}

template<typename T1, typename T2>
double A<std::complex<double>,std::complex<double> >::multiply_and_real(){

    return a.real()*b.real();
}


template class A< double, double >;
template class A< std::complex<double>, double >;
template class A< double,std::complex<double> >;
template class A< std::complex<double>,std::complex<double> >;

我怎样才能以正确的方式做到这一点?通过这种实现,我得到了类似的错误消息:

error: prototype for ‘double A<double, double>::multiply_and_real()’ does not match any in class ‘A<double, double>’
 double A<double,double>::multiply_and_real(){  

1 个答案:

答案 0 :(得分:0)

由于您正在使用以下语法,请注意template<> eveywhere

template<>
double A<double,double>::multiply_and_real(){

    return a*b;
}

template<>
double A<std::complex<double>,double>::multiply_and_real(){

    return a.real()*b;
}

template<>
double A<double,std::complex<double> >::multiply_and_real(){

    return a*b.real();
}

template<>
double A<std::complex<double>,std::complex<double> >::multiply_and_real(){

    return a.real()*b.real();
}

同时阅读this以避免将来的疑虑;