我有以下类(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)一个成员函数指针,将生成一个具有三个参数的仿函数。
您有几种解决方法:
- 编写自己的仿函数来执行您想要的操作。
- 写一个显式循环而不是
std::for_each
。 - 我在上面提到的(并在@David 的回答中演示)的一个尚未标准的 Binder 函数
- 首先不要为虚函数操心——让你的方法接受一个普通的函数指针并根据函数指针来实现。当然,这只有在
myfunc
不依赖于它所属的类的成员时才有效(在这种情况下,它一开始就不应该被放入一个类中)
关于c++ - mem_func 和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519991/