我有以下课程:
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
你知道为什么吗?答案 0 :(得分:1)
您正在寻找 std::mem_fun(&A::myfunc)
。
编辑:你不能在这里使用mem_fun
- mem_fun
的重载不允许你将两个参数成员函数变成一个仿函数。您将不得不使用类似boost::bind
/ std::tr1::bind
(如果您有TR1)/ std::bind
(如果您有C ++ 0x)或者您将不得不使用的内容写自己的仿函数。
请注意,即使mem_fun
能够执行此类绑定,std::bind2nd
也会失败,因为bind2nd
期望一个仿函数接受两个参数,并绑定一个成员函数指针这将产生一个带有三个参数的仿函数。
你有几种解决方法:
std::for_each
。myfunc
不依赖于它所属的类的成员时才有效(在这种情况下,它不应该首先被放入类中)。答案 1 :(得分:0)
您在此处尝试使用的是使用pointer to a member function将另一个对象的成员函数应用于容器中的每个对象。显然,在这种情况下,没有适配器可以工作。在这种情况下,唯一的解决方案是为它编写一个特殊的包装函数类。
答案 2 :(得分:0)
您的声明并不代表您想要做的事情。
尝试:
void someOtherFunc(const std::string& str)
{
std::string tmp;
B BInstance;
A* ptrToB = &BInstance;
for_each(str.begin(),
str.end(),
boost::bind(&A::myfunc, ptrToB, _1, &tmp));
}
这个(或变体)应该做你想要的。
答案 3 :(得分:0)
看看std :: mem_fun背后的实现,你应该能够编写自己的:
编辑(使其“人类可读”)
template<class Result, class Ty, class Arg>
class mem_fun1_t : public binary_function<Ty*, Arg, Result>
{
private:
Result (Ty::*m_mf)(Arg);
public:
mem_fun1_t(Result (Ty::*mf)(Arg)) : m_mf(mf) { }
Result operator()(Ty* pLeft, Arg Right) const {
return ((pLleft->*m_mf)(Right));
}
};