【问题标题】:Overloading Memberfunction for a class with templates使用模板重载类的成员函数
【发布时间】:2014-11-20 19:23:51
【问题描述】:

当我有一个带有模板的类时,我该如何实现,依赖于数据类型,我可以计算某事。具有一定的成员函数。 我构建了一个最小示例,其目标是将两个数字相乘,这两个数字可以是实数也可以是复数,结果只取它的实数部分: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(){  

【问题讨论】:

    标签: c++ class templates overloading


    【解决方案1】:

    由于您专门使用以下语法,请注意 template&lt;&gt;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以避免您未来的疑虑;

    【讨论】:

    • "`A::multiply_and_real() 的多重定义"
    • @karlo86 可能是一些多头包含问题。它不应该给出任何问题。见this
    • @POW 你是对的。将所有内容放入一个文件中再次起作用。您是否在这里看到了问题,将其放在两个文件中?
    • @POW 好的,它可以工作。这只是主文件中的一个错误。如果类有第三个模板,但它对成员函数 multiply_and_real() 没有作用,这是否也以同样的方式工作?我是否必须为专业写作:“template double A::multiply_and_real(){”
    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多