c++ - 如何在模板类的成员中使用重载的原始 exp

标签 c++ templates member overloading exp

我正在使用模板类 ( Pol<T> ) 来计算多项式,并希望使用成员函数 ( .exp() ) 将多项式 P 转换为其指数 e^P。
重载指数函数工作正常,编译器选择原始指数 exp(double)如果T = double和我自己的如果T=Pol<double> ,但在成员函数中我得到:

error: no matching function for call to ‘Pol<double>::exp(double&)’

我不能在成员函数中使用 std::exp,因为我使用的是多阶多项式,例如:

Pol< Pol< complex<double> > > P1

我可以使用重载指数来解决问题,但我不明白为什么它在成员内部是不可能的。

这是我的代码:

#include <iostream>
#include <math.h>
#include <vector>
using std::cout;
using std::endl;

template < class T>
class Pol;

template < class T >
const Pol< T > exp(const Pol< T >& P);

template < class T >
class Pol{
protected:
    std::vector< T > Data;

public:
    inline Pol():Data(1){}

    inline const T operator[](int i)const{return Data[i];}
    inline T& operator[](int i){return Data[i];}

    Pol& exp();
};

template < class T >
const Pol< T > exp(const Pol< T >& P){
    Pol< T > Erg(P);
    Erg[0] = exp(P[0]);           // works fine
    return Erg;
}

template < class T >
Pol< T >& Pol< T >::exp(){
    Data[0] = exp(Data[0]);      // here appears the error
    return *this;
}

int main() {
    Pol<double> P1;

    P1 = exp(P1);   // this works
    P1.exp();       // this enforces the error

    cout << "P1[0]" << P1[0] << endl;
    return 0;
}

最佳答案

编辑后,解决方案非常简单。如果您有成员函数,查找将忽略全局模板函数。您需要明确引用它:

Data[0] = ::exp(Data[0]);
//        ^^ global scope

Live example

如果你想让编译器看到两者,你也可以使用:

using ::exp;
Data[0] = exp(Data[0]);

Live example

关于c++ - 如何在模板类的成员中使用重载的原始 exp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23479663/

相关文章:

c++ - `std::common_type` 是关联的吗?

c++ - 即使使用#include <Shlobj.h> 和#pragma 注释(lib, "Shell32.lib")也无法调用 SHGetKnownFolderPath()

c++ - 模板定义语法

c++ - 使用 boost::function 和 boost::bind 确定仿函数中的对象和方法

c++ - 为什么我们不能在模板静态成员初始化中使用auto?

c++ - 没有匹配的调用函数

c - 获取有关 C 类型结构体成员的信息(类型、值...等)

c++ - 自动生成基于成员的操作?

c++ - 使用邻接矩阵解决图问题

c++ - 按下键时停止 C++ 中的无限循环