c++ - mem_func 和虚函数

标签 c++ pointer-to-member

我有以下类(class):

 class A
{
   public:
        virtual void myfunc(unsigned char c, std::string* dest) = 0;
};

   class B : public class A
{
    public:
        virtual void myfunc(unsigned char c, std::string* dest);
};

void someOtherFunc(const std::string& str,A *pointerFunc)
{
    std::string tmp;
        for_each(str.begin(),
                 str.end(),                 
                 std::bind2nd(std::mem_fun(pointerFunc->myfunc), &tmp));
}

我得到以下编译错误: 错误:没有匹配函数来调用\u2018mem_fun()\u2019

你知道为什么吗?

最佳答案

您正在寻找 std::mem_fun(&A::myfunc)

编辑:您根本不能在这里使用 mem_fun -- mem_fun 的重载不允许您将两个参数的成员函数变成仿函数。你将不得不使用类似 boost::bind/std::tr1::bind (如果你有 TR1)/std::bind (如果你有 C++0x)或者你将不得不编写你自己的仿函数。

请注意,即使 mem_fun 能够进行这种绑定(bind),std::bind2nd 也会失败,因为 bind2nd 需要一个带有两个参数的仿函数,并像这样绑定(bind)一个成员函数指针,将生成一个具有三个参数的仿函数。

您有几种解决方法:

  1. 编写自己的仿函数来执行您想要的操作。
  2. 写一个显式循环而不是 std::for_each
  3. 我在上面提到的(并在@David 的回答中演示)的一个尚未标准的 Binder 函数
  4. 首先不要为虚函数操心——让你的方法接受一个普通的函数指针并根据函数指针来实现。当然,这只有在 myfunc 不依赖于它所属的类的成员时才有效(在这种情况下,它一开始就不应该被放入一个类中)

关于c++ - mem_func 和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519991/

相关文章:

c++ - 向 QStyleOptionButton 添加样式表和图标

c++ - 如何typedef指向返回方法指针的方法的指针?

c++ - 如何在 libcurl 中使用成员函数指针

c++ - 模板可以用来检测继承关系吗

c++ - 在map删除C++期间循环执行了多少次

c++ - TeamCity 中的 Qt 测试输出

c++ - 确定距离直线一定距离的点

C++ 指向派生类成员的指针

c++ - 将成员函数传递给另一个对象的成员函数C++

c++ - 如何获得指向类的复制构造函数的成员函数指针?