2

我正在尝试将派生类中的函数传递给需要函数指针的基类函数,但出现编译器错误。

[BCC32 Error] E2034 Cannot convert 'void (Bar::*)(int)' to 'void (Foo::*)(int)'

我想这是按设计的,但是有没有一种不涉及不愉快的铸造的方法呢?可以boost::bind在这里帮助我吗?

#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))

class Foo
{
public:
  typedef void (Foo::*FFunc)(int i);

  void test(FFunc f)
  {
    CALL_MEMBER_FN(*this,f)(123);
  }

  void barf1(int i) {};
};

class Bar : public Foo
{
public:
  void barf2(int i) {};
};

void ffff()
{
  Foo f;
  f.test(Foo::barf1); // works

  Bar b;
  b.test(Bar::barf1); // works
  b.test(Bar::barf2); // ERROR
}

作为旁注,我使用虚函数可以正常工作,这是一种明显的方法,而不是函数指针,但我只是想让它以这种方式工作,然后再尝试一些 boost::bind 技巧......

4

3 回答 3

1

b.test( ( Foo::FFunc )&Bar::barf2 );

对不起,并不是要提交它作为答案,想发表评论。示例代码

编辑:好吧,也许这是更“令人愉快”的铸造,因为它是 C++ 风格?更新样本。

b.test( static_cast< Foo::FFunc >(&Bar::barf2) );

于 2012-01-10T13:28:15.770 回答
1

你能概括一下函数指针吗?我的意思是这样的:

typedef void (Foo::*FFunc)(int i);

至:

typedef void (*FFunc)(int i);

然后你可以使用绑定:

b.test(bind(&Bar::barf2, &b));
于 2012-01-10T14:02:06.963 回答
1

同样,由于我对 c++11 && bost && stl 的了解不是最好的,我只能建议:

 template <typename T>
    void test(void (T::*f)(int))
  {
    CALL_MEMBER_FN(static_cast<T&>(*this),f)(123);
  }

所有其他代码与您的相同。

糟糕的铸造,但它是隐藏的

于 2012-01-10T13:37:18.397 回答