【发布时间】:2010-06-10 08:36:07
【问题描述】:
我们在使用 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 >, std::basic_string, std::allocator >>' 转换到非标量类型 'std::string' 请求
因为我们有一个解决方法,所以我们很想知道为什么第一种形式会导致问题。我确定我们遗漏了一些东西,但我们无法弄清楚它是什么。
【问题讨论】:
-
函子?这让我笑了:)
-
@VoodooChild,为什么?在这种情况下,函子一词是正确的。