C ++:将静态类成员与静态类成员的传递版本进行比较

Posted

技术标签:

【中文标题】C ++:将静态类成员与静态类成员的传递版本进行比较【英文标题】:C++: Comparing static class member to a passed version of the static class member 【发布时间】:2013-12-09 21:05:59 【问题描述】:

我有几个非常相似的同一个类的函数,它们可以互换地传递给一个函数。对于一个函数,它使用稍微不同的参数运行,所以我必须检查传递了哪个函数。目前我正在使用 if 语句,但收到错误

 error: invalid operands of types ‘double (Integrators::*)(double (*)(double),
      int, double, double, bool)’ and ‘double (*)(double (*)(double), int, 
       double, double, bool)’ to binary ‘operator==’
            if(Meth==&Integrators::Trap || Meth==&Integrators::Simp ||

这是类声明和我的代码的开始:

class Integrators
public:
    static double Trap(double(*f)(double),int N, double a, double b, 
        bool closed=true);
    static double Simp(double(*f)(double),int N, double a, double b, 
        bool closed=true);
    static double Midp(double(*f)(double),int N, double a, double b,
        bool closed=true);
    static double SInf(double(*f)(double),int N, double a, double b, 
        bool closed=true);
    double ToEps(double (Integrators::*Meth)(double
                    (double),int,double,double,bool), 
        double (*f)(double), double a, double b, 
                    double eps, int Jmax=100, int Jmin=3, 
                    bool closed=true);
;

double Integrators::ToEps(double (Integrators::*Meth)(double (double),int,double,
    double,bool), 
            double (*f)(double), double a, double b, double eps,
            int Jmax, int Jmin, bool closed)


    double fac;
    if(Meth==&Integrators::Trap || Meth==&Integrators::Simp ||
        Meth==&Integrators::SInf)
    fac=2.;
    else if(Meth==&Integrators::Midp)
    fac=3.;

更新::

我正在尝试使用

void * Pmeth=reinterpret_cast<void*>(Meth);

对于每个功能。仅适用于 Meth,(不是 Trap 等)我收到错误消息

Integrators.cpp:216:43: warning: converting from ‘double (Integrators::*)
(double (*)  (double), int, double, double, bool)’ to ‘void*’ 
[-Wpmf-conversions]  void * Pmeth=reinterpret_cast<void*>(Meth);

static_cast 给了我错误:无效的 static_cast

【问题讨论】:

【参考方案1】:

该错误表明您正在将指向全局函数的指针与指向类方法的指针进行比较。它们是不同的类型。

编辑:指向类静态方法的指针与指向全局函数的指针具有相同的类型。所以Trap 的类型是double (*)(double (*)(double), int, double, double, bool) 而不是double (Integrators::*)(double (*)(double), int, double, double, bool)

【讨论】:

有解决办法吗?指针不只是内存中的一个位置,两个函数在内存中的长度不一样吗?

以上是关于C ++:将静态类成员与静态类成员的传递版本进行比较的主要内容,如果未能解决你的问题,请参考以下文章

总结C++与C#中的static静态修饰符

类和动态内存分配

java第五章:面向对象(oop)之 static关键字

C++学习之静态成员

类的静态成员

java中私有的属性、静态成员可以被子类继承吗?