2

这可能是基本的东西,我有一个来自一个类(称为cell)的函数,其标识符woo_func_ptr采用指向void不带参数的类型函数的指针(void (*void_ptr)(void))(我typedef)。在另一个类中,我有一个对象,cell我使用方法woo_func_ptr。它不允许我这样做,我在上面的标题中得到了错误。如果这两个函数没有嵌入到一个类中,它们就可以正常工作

typedef void (*void_ptr)(void);



double WOO{0};

struct cell {
void woo_func_ptr(void_ptr jo)
{
    jo();
}
};


class woosah
{
public:
void woo_func()
{
    WOO+=rand();
    std::cout << WOO << std::endl;
};

void run()
{
    // other stuff
    temp_cell.woo_func_ptr(woo_func);
    // yet more stuff
}

cell temp_cell;
};
4

4 回答 4

3

首先,指向 woosah 成员函数的指针应声明为

  typedef void (woosah::*void_ptr)(void);

然后编译器会抱怨它在解析这个语句时需要查看 woosah 定义。

如果您让编译器首先通过向上移动类 woosah 来解析它,那么它会抱怨未定义类型单元(因为它包含在 woosah 中)。由于解析时的循环依赖,这仍然无法解决您的问题。

解决循环依赖的一种方法是使temp_cell成为指向单元实例的指针,并将其包含在 woosah 中。

另请注意,调用成员函数的语法是使用 .* 或 ->*

      void run()
      {
          // other stuff
          temp_cell->woo_func_ptr(temp_cell->*woo_func); // assuming temp_cell is pointer to some cell instance
         // yet more stuff
       }
于 2013-03-28T01:20:23.880 回答
2

成员函数不同于常规函数。这就是为什么有一个单独的“指向成员函数的指针”类型。这是因为成员函数传递了隐式this指针。

事实上,标准甚至(严重)限制了指向成员函数的指针的转换。

这就是你错误的根源。

于 2013-03-28T00:51:44.003 回答
2

http://msdn.microsoft.com/en-us/library/b0x1aatf(v=vs.80).aspx显示了类似的错误及其修复。

于 2013-03-28T01:11:04.080 回答
1

您可以使用静态类函数...

改变

void woo_func()

static void woo_func()

如果您尝试访问特定对象的数据成员,这可能不是您想要的。

成员函数有点特殊,不应被视为普通函数。

于 2013-03-28T01:16:33.377 回答