find_if를 사용하여 쌍의 첫 번째 요소가 특정 값과 일치하는 항목의 벡터 쌍을 검색하는 데 문제가 있습니다. 이 작업을 수행하기 위해 operator()가 쌍을 입력으로 사용하여 첫 번째 항목을 문자열과 비교하는 간단한 함수를 정의했습니다.functor를 사용하여 find_if를 호출하는 컴파일 오류
불행히도 임시 문자열 값을 사용하여 작성한 Functor의 인스턴스를 사용하여 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: error: conversion from ‘std::pair, std::allocator >, std::basic_string, std::allocator > >’ to non-scalar type ‘std::string’ requested
, 우리는있어 첫 번째 형식이 문제를 일으키는 이유는 무엇인지 궁금해합니다. 우리가 뭔가를 놓친 것 같지만, 그것이 무엇인지 알 수는 없습니다.
functor? 그게 내가 낄낄 웃게 만들었지 :) – VoodooChild
@VoodooChild, 왜? functor라는 용어는이 문맥에서 정확합니다. – avakar