2

我有以下课程:

 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));
}

我收到以下编译错误:error: no matching function for call to \u2018mem_fun()\u2019

你知道为什么吗?

4

4 回答 4

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期望仿函数接受两个参数,并且像这样绑定成员函数指针将产生一个具有三个参数的仿函数。

你有几种方法可以解决这个问题:

  1. 编写你自己的仿函数来做你想做的事。
  2. 写一个显式循环而不是std::for_each.
  3. 我上面提到的尚未标准的活页夹功能之一(并在@David的回答中进行了演示)
  4. 首先不要理会虚函数——让你的方法接受一个普通的函数指针并根据函数指针来实现。当然,这只有在myfunc不依赖于它所属的类的成员时才有效(在这种情况下,它不应该首先被放入一个类中)
于 2010-12-23T15:31:27.150 回答
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));
}

这(或变体)应该做你想做的事。

于 2010-12-23T15:34:17.620 回答
0

您在这里尝试使用的是使用指向成员函数的指针将另一个对象的成员函数应用于容器中的每个对象。显然,在这种情况下,没有一个适配器可以工作。在这种情况下,唯一的解决方案是为它编写一个特殊的包装函子类。

于 2010-12-23T15:26:30.123 回答
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));
 }
};
于 2010-12-23T15:39:15.100 回答