重载具有模板的类的成员函数

Overloading Memberfunction for a class with templates

本文关键字:函数 成员 重载      更新时间:2023-10-16

当我有一个带有模板的类时,我如何实现依赖于数据ypes,我可以使用某个成员函数计算sth。我构造了一个最小的例子,其中的目标是将两个数字相乘,这两个数字可以是实数,也可以是复数,而不是只取它的实数部分: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 文件,测试.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(){  

由于您专门使用以下语法,因此请注意 template<>

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();
}

另请阅读此内容以避免您将来的疑问;