在类构造函数中设置函数指针...'&' :绑定成员函数表达式的非法操作

时间:2013-12-07 16:20:22

标签: c++ compiler-errors function-pointers

我正在尝试在类的构造函数上设置函数指针。

我收到以下错误:

错误1错误C2276:'&' :对绑定成员函数表达式的非法操作

任何人都可以告诉为什么会发生这种情况(下面的代码)?

编辑:

这个问题的例子更能说明我的情况。我只能改变MyClass。我无法触摸MyBase或它的内容。

class MyBase
{
public:

    void (*MyFunctionPointer)(int args);

};

class MyClass : public MyBase
{
public:

    void MyFunction(int args)
    {
    }

    MyClass()
    {
        MyFunctionPointer = &MyFunction;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    MyClass temp;

    return 0;
}

class MyBase { public: void (*MyFunctionPointer)(int args); }; class MyClass : public MyBase { public: void MyFunction(int args) { } MyClass() { MyFunctionPointer = &MyFunction; } }; int _tmain(int argc, _TCHAR* argv[]) { MyClass temp; return 0; }

2 个答案:

答案 0 :(得分:1)

MyFunction成员函数,但MyFunctionPointer是基本函数指针。

您应该调查生成a pointer-to-member-function的语法。

答案 1 :(得分:1)

指向方法函数的指针与指向全局函数和静态方法的指针的类型不同。

class MyClass;

class MyBase
{
public:

    void (MyClass::* MyFunctionPointer)(int);

};

class MyClass : public MyBase
{
public:

    void MyFunction(int args)
    {
    }

    MyClass()
    {
        MyFunctionPointer = &MyClass::MyFunction;
    }
};

int main(int argc, char* argv[])
{
    MyClass temp;

    return 0;
}

如果您无法更改MyBase,则无法使用成员MyFunctionPointer,因为它是指向全局函数或静态方法的类型指针。如果你告诉我们你想要达到的目的是什么,也许我们可以帮助你。

编辑2(操作编辑):

我要做的是编写一些可以提供此功能的代码。即,一个带有函数指针的基类,可以设置为非成员函数(temp1)...或者从包含可以被调用的非静态成员的类继承(temp2)。

class MyBase
{
public:

    void (*MyFunctionPointer)(int args);

};

class MyClass : public MyBase
{
public:

    void MyFunction(int args)
    {
    }

    void Bind(void (*myFunctionPointer)(int args))
    {
        MyFunctionPointer = myFunctionPointer;
    }
};

void MyFunction2(int args)
{
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyBase temp1;
    temp1.MyFunctionPointer = &MyFunction2;        // <<-- ok
    temp1.MyFunctionPointer(0);

    MyClass temp2;
    temp2.Bind(&temp2.MyFunction);  // <<-- compile error
    temp2.MyFunctionPointer(0);

    return 0;
}

class MyBase { public: void (*MyFunctionPointer)(int args); }; class MyClass : public MyBase { public: void MyFunction(int args) { } void Bind(void (*myFunctionPointer)(int args)) { MyFunctionPointer = myFunctionPointer; } }; void MyFunction2(int args) { } int _tmain(int argc, _TCHAR* argv[]) { MyBase temp1; temp1.MyFunctionPointer = &MyFunction2; // <<-- ok temp1.MyFunctionPointer(0); MyClass temp2; temp2.Bind(&temp2.MyFunction); // <<-- compile error temp2.MyFunctionPointer(0); return 0; }

编辑:

如前所述,指向函数的指针和指向方法的指针是不同的类型。那是一个指向函数的指针,不能分配方法地址和指向方法的指针不能分配函数地址。你可以有两个指针,一个指向函数的类型指针,另一个指向方法的指针和一个布尔值,它告诉你你使用哪两个指针。或者你可以使用模板。