如何将指向静态函数的指针作为参数从C ++中的静态函数内部传递给另一个静态函数

时间:2014-05-08 19:13:45

标签: c++ static function-pointers argument-passing

如何将指向静态函数的指针作为参数传递给静态函数内的另一个静态函数,这些函数都在同一个类中?我使用的是VisualStudio 2010。 我的代码大致如下:

//SomeClass.h
class SomeClass
{
    public:
        static AnotherClass* doSomething(AnotherClass*, AnotherClass*);
        static AnotherClass* doSomethingElse(AnotherClass*, AnotherClass*);

    private:
        typedef float (SomeClass::*SomeOperation)(float, float);
        static AnotherClass* apply(AnotherClass*, 
                                   AnotherClass*, 
                                   SomeOperation);

        static float SomeClass::operationA(float, float);
        static float SomeClass::operationB(float, float);
};

//SomeClass.cpp
AnotherClass* SomeClass::doSomething(AnotherClass* a, AnotherClass* b)
{
    return apply(a, b, &SomeClass::operationA);
}

AnotherClass* SomeClass::doSomethingElse(AnotherClass* a, AnotherClass* b)
{
    return apply(a, b, &SomeClass::operationB);
}

AnotherClass* apply(AnotherClass* a, 
                    AnotherClass* b, 
                    SomeOperation op)
{
    /* Some sanity checking and a lot of loop stuff which is the same
     * for all operations a, b, c ... */

}

我尝试了不同的变体,但一直遇到编译器错误,如:

C2664" SomeClass :: apply":参数3的转换来自' float(__ cdecl *)(float,float)'在SomeClass :: SomeOperation'不可能。

有谁知道我做错了什么以及如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

静态成员函数只是一个函数;你没有使用指向成员语法的指针。

所以而不是

typedef float (SomeClass::*SomeOperation)(float, float);

你想要

typedef float (*SomeOperation)(float, float);

您可以通过operationA而不是&SomeClass::operationA

答案 1 :(得分:2)

改变这个:

private:
    typedef float (SomeClass::*SomeOperation)(float, float);

对此:

public:
    typedef float (*SomeOperation)(float, float);

或者你可以简单地在课堂外声明typedef float (*SomeOperation)(float, float) ......

答案 2 :(得分:0)

从typedef中删除SomeClass::

示例中存在各种语法错误,但在修复它们之后,我可以编译代码。