如何获取重载成员函数的地址?

时间:2009-04-01 14:44:25

标签: c++ overloading pointer-to-member

我正在尝试获取指向重载成员函数的特定版本的指针。这是一个例子:

class C
{
  bool f(int) { ... }
  bool f(double) { ... }

  bool example()
  {
    // I want to get the "double" version.
    typedef bool (C::*MemberFunctionType)(double);
    MemberFunctionType pointer = &C::f;   // <- Visual C++ complains
  }
};

错误消息是“错误C2440:'初始化':无法从'重载函数'转换为'MemberFunctionType'”

如果f未重载,则此方法有效,但在上面的示例中没有。有什么建议吗?

修改

请注意,上面的代码并没有反映我的现实问题,那就是我忘记了一个“const” - 这就是接受的答案所指出的。不过,我会留下问题,因为我认为问题可能发生在其他人身上。

1 个答案:

答案 0 :(得分:27)

好吧,我会回答我作为评论的内容,因此可以接受。问题在于constness:

class C
{
  bool f(int) { ... }
  bool f(double) const { ... }

  bool example()
  {
    // I want to get the "double" version.
    typedef bool (C::*MemberFunctionType)(double) const; // const required!
    MemberFunctionType pointer = &C::f;
  }
};

澄清:

原始问题不包含const。我在评论中做了一个疯狂的猜测,他是否可能f在实际代码中是一个const成员函数(因为在较早的迭代中,它发现了另一件事遗漏/与现实代码不同:p)。他实际上有一个const成员函数,并告诉我我应该发布这个作为答案。