使用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'请求
因为我们有一个解决方法,所以我们对第一种形式导致问题的原因感到好奇。我确信我们遗漏了一些东西,但我们无法弄清楚它是什么。
答案 0 :(得分:6)
你可以这样做:
MyFunctor f(s);
或
MyFunctor f((std::string(s)));
原始声明函数f
。 f
只接受一个参数,一个指向函数的指针[{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
的输入,这会导致编译错误。