2014-11-20 2 views
0

4.8 ++ g와 같은 오류 생성하는 코드의 증류 버전 다음 여기find_if()는 CONST 함수 예기치 반복자 타입을 리턴

x.cpp: In member function ‘void Container::find() const’: 
x.cpp:11:71: error: 
conversion from ‘__gnu_cxx::__normal_iterator<const Element*, std::vector<Element> >’ to non-scalar type ‘std::vector<Element>::iterator {aka __gnu_cxx::__normal_iterator<Element*, std::vector<Element> >}’ requested vector<Element>::iterator it = find_if(v.begin(), v.end(), f); 

및 코드된다

#include <algorithm> 
#include <vector> 
using namespace std; 

struct Element{}; 
struct Functor{ bool operator()(const Element &){return false;}; }; 
struct Container{ 
    vector<Element> v; 
    void find() const { 
     Functor f; 
     vector<Element>::iterator it = find_if(v.begin(), v.end(), f); 
    } 
}; 
int main() { return 0; } 

find() 함수에서 const 한정자를 제거하면 오류가 사라집니다. 오류의 원인은 무엇입니까? 표준에 대한 언급이 권장됩니다. 관심 주제에 초점을 맞추기 위해 술어 등의 논리가 제거되었습니다. clang 3.4도 비슷한 결과를 산출합니다. v 이후

+0

'main'에서'return 0'이 함축되어 있습니다. –

+1

C++ 11을 사용하는 경우 반환 된 변수에 auto를 사용하십시오. –

답변

2

v.begin()v.end() 유형 (const을 자체 임)의 constContainer::find, 따라서 find_if의 리턴 타입은 vector<Element>::const_iterator이다.

+0

그래서 const 한정 함수 내에서 정의 된 모든 변수는 정의에 const 한정자가 없더라도 자동으로 const로 선언됩니까? – user2141130

+0

@ user2141130 : 일종의. 그것이 멤버 함수가 작동하는 방식입니다. (멤버는 "다시 선언되지"않습니다. 대신 멤버 이름이 참조하는 값은 일반적으로 'const'값입니다.) –

관련 문제