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

C++ 如何将指向静态函数的指针作为参数从C+中的静态函数内部传递给另一个静态函数+;,c++,static,function-pointers,argument-passing,C++,Static,Function Pointers,Argument Passing,如何从静态函数内部将指向静态函数的指针作为参数传递给另一个静态函数,这些静态函数都在同一个类中?我正在使用VisualStudio2010。 我的代码大致如下所示: //SomeClass.h class SomeClass { public: static AnotherClass* doSomething(AnotherClass*, AnotherClass*); static AnotherClass* doSomethingElse(Anothe

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

//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从“SomeClass::SomeOperation”中的“float(u cdecl*)(float,float)”转换


有人知道我做错了什么,以及如何解决这个问题吗

从typedef中删除
SomeClass::


示例中有各种语法错误,但在修复它们并执行这些操作后,我可以编译您的代码。

从typedef中删除
SomeClass::


示例中有各种语法错误,但在修复它们并执行这些操作后,我可以编译您的代码。

静态成员函数只是一个函数;您不会对其使用指向成员的指针语法

所以不是

typedef float (SomeClass::*SomeOperation)(float, float);
你想要

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

您可以只传递
operationA
而不是
&SomeClass::operationA

静态成员函数只是一个函数;您不会对其使用指向成员的指针语法

所以不是

typedef float (SomeClass::*SomeOperation)(float, float);
你想要

typedef float (*SomeOperation)(float, float);
您只需传递
operationA
,而不是
&SomeClass::operationA

即可更改此项:

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

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

或者您可以简单地在类之外声明
typedef float(*SomeOperation)(float,float)

更改此项:

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

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


或者,您可以简单地在类之外声明
typedef float(*SomeOperation)(float,float)

我相信您希望切换到为您提供实现的。考虑升级你的编译器:最近——例如4.8或4.9——支持C++ 11。@巴西尔,即“使用jQuery”@ @ LealnisraceSein轨道:或者“使用OcAML”或“使用普通LISP”……我相信你想切换到它,使你实现。考虑升级你的编译器:最近——例如4.8或4.9——支持C++ 11。@巴西尔,即“使用jQuery”@ @ LealNeasraceSin轨道:或者“使用OcAML”或“使用普通LISP”……是的,这就是TYVM!我不确定它是VS2010编译器还是一般的东西,但我有另一个typdef,用于指向程序中另一个点的非静态方法的指针,这里需要“SomeClass::”。是的,就是tyvm!我不确定这是VS2010编译器还是一般的东西,但我有另一个typdef,用于指向程序中另一点的非静态方法的指针,这里需要“SomeClass::”这个词。我接受这个词作为正确答案,因为解释了为什么必须省略“SomeClass:”部分。再次感谢大家的快速回答。我接受这一个作为正确答案,因为解释了为什么必须省略“SomeClass::”部分。再次感谢大家的快速回答。