使用仿函数调用find_if的编译错误

时间:2010-06-10 08:36:07

标签: c++ stl

使用find_if搜索对的向量时,我们遇到一些麻烦,对于该对象的第一个元素匹配特定值。为了完成这项工作,我们定义了一个简单的函子,其operator()将一对作为输入,并将第一个条目与一个字符串进行比较。

不幸的是,当我们实际使用使用临时字符串值构造的函数实例添加对find_if的调用时,编译器会生成大量错误消息。很奇怪(对我来说,无论如何),如果我们用我们在堆栈上创建的字符串替换临时字符,事情似乎有效。

以下是代码(包括两个版本)的样子:

typedef std::pair<std::string, std::string> MyPair;
typedef std::vector<MyPair> MyVector;

struct MyFunctor: std::unary_function <const MyPair&, bool>
{
  explicit MyFunctor(const std::string& val)
    : m_val(val) {}

  bool operator() (const MyPair& p)
  {
    return p.first == m_val;
  }

  const std::string m_val;
};

bool f(const char* s)
{
  MyFunctor f(std::string(s));  // ERROR
  // std::string str(s);                                                                                                  
  // MyFunctor f(str);              // OK                                                                                                    
  MyVector vec;
  MyVector::const_iterator i = std::find_if(vec.begin(), vec.end(), f);
  return i != vec.end();
}

以下是最有趣的错误消息:

  

/ usr / include / c ++ / 4.2.1 / bits / stl_algo.h:260:错误:从'std :: pair,std :: allocator&gt;,std :: basic_string,std :: allocator&gt;转换&gt;'到非标量类型'std :: string'请求

因为我们有一个解决方法,所以我们对第一种形式导致问题的原因感到好奇。我确信我们遗漏了一些东西,但我们无法弄清楚它是什么。

3 个答案:

答案 0 :(得分:6)

这是most vexing parse

你可以这样做:

MyFunctor f(s);

MyFunctor f((std::string(s)));

原始声明函数ff只接受一个参数,一个指向函数的指针[{1}}并返回s

答案 1 :(得分:0)

MyFunctor f = MyFunctor(s);

更清晰,工作原理相同。

答案 2 :(得分:-1)

的第一个错误
MyFunctor f(std::string(s));

是因为std :: string(s)是rvalue(临时)和函数

explicit MyFunctor(const std::string& val)

需要无法从右值获取的引用。

您收到的第二条错误消息是因为您在vector<pair<string, string>>上进行迭代,这需要一个类型为pair<string, string>的输入的仿函数,但您的仿函数接受类型string的输入,这会导致编译错误。