2010-06-10 3 views
3

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

, 우리는있어 첫 번째 형식이 문제를 일으키는 이유는 무엇인지 궁금해합니다. 우리가 뭔가를 놓친 것 같지만, 그것이 무엇인지 알 수는 없습니다.

+0

functor? 그게 내가 낄낄 웃게 만들었지 :) – VoodooChild

+0

@VoodooChild, 왜? functor라는 용어는이 문맥에서 정확합니다. – avakar

답변

6

이것은 most vexing parse입니다.

당신은 할 수 있습니다 :

MyFunctor f(s); 

또는

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

원래 함수 f를 선언합니다. f은 하나의 인수, 즉 s 인수를 취하고 std::string을 반환하는 함수에 대한 포인터를 취합니다. STD : 문자열 (들)을 r- 수치 (임시) 펑션

explicit MyFunctor(const std::string& val) 

이다 r- 수치에서 수행 할 수없는 참조가 필요하기 때문에

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

에서

+0

감사! 그 상황을 완벽하게 정리했습니다. –

+1

... 또는 간단히 : MyFunctor f (s). 'const char *'에서'std :: string'으로 암시 적으로 변환되기 때문에 강제로 변환 할 필요가 없습니다. –

-1

제 오류이다.

두 번째 오류 메시지는 pair<string, string> 입력을받는 펑터가 필요하지만 펑터는 string 입력을 받아들이므로 컴파일 오류가 발생하므로 vector<pair<string, string>>을 반복하기 때문입니다.

+2

'MyFunctor' 생성자는 문자열에 대한'const' 참조를 취합니다. 'const' 때문에 일시적입니다. 일단 functor가 생성되면, find_if는 operator()가 취하는 매개 변수만을 처리합니다. 그것은 꼭 필요한대로 MyPair에 대한 const 참조를 취합니다. –

0
MyFunctor f = MyFunctor(s); 

은 더 명확하고 동일하게 작동합니다.

+0

... 또는 "MyFunctor f (s)"는 더 간단하고 명확합니다 (적어도 나에게) –