1
typedef void (*callable_function)(double);
void call_function(callable_function func)
{
    func(3.0);
}

class Foo;

union converter {
    callable_function func;
    void (Foo::*foo_func)(void);
};

class Foo {
private:
    double d;
public:
    Foo(void) : d(0.0)
    {
        converter c;
        c.foo_func = &Foo::set_double;
        call_function(c.func);//I know i can call the function directly, but that is not what i want to achieve
    }

    void set_double(double value)
    {
        d = value;
    }
};

void main(void)
{
    Foo foo;
}

尝试执行上面的代码时,我在以下行中收到堆损坏错误: d = value;.
可能是因为被调用的函数是类函数,而不是成员函数。

但是,如果我尝试将这一行更改:c.foo_func = &Foo::set_double;to c.foo_func = &this->set_double;,我会收到此编译器错误:

error C2276: '&' : illegal operation on bound member function expression

问题 #1:有没有办法将指针(可能是强制转换)从void(Foo::*)(void)to转换为void()(void)或修复编译器错误?

4

1 回答 1

0

指向“自由”函数的指针和指向 C++ 中的成员函数的指针具有不同的大小。这意味着您在技术上可以将指向自由函数的指针转换为 void* ptr,因为它们通常具有相同的大小,但您不能将成员函数指针转换为 void* 或其他自由函数 - 您将得到您所拥有的。

检查这个:指向成员表示的指针

于 2013-10-20T01:31:05.930 回答