2013-01-08 1 views
2

여기에 뭔가가 분명히 누락되었지만 무엇이 있을까요?연산자 = 일치하지 않음 (벡터의 값을 찾으십시오 <string>)

정의 (...이 유효 코드, 실제하지 세 개의 점을 의미) :이 가지고있는 코드에서

class CrmxFile { 
private: 
    const std::vector<std::string> validValues; 
    int value; 

public: 
    void setValue(std::string _value); 

... 
} 

std::vector<std::string> CrmxFile = {...}; 

을 :

void Crmx::SetValue(std::string _value) { 
    std::vector<std::string>::iterator idx; 
    if((idx = std::find(validValues.begin(), validValues.end(), _value)) == validValues.end()) { 
     value = 0; 
    } 
    else { 
     value = idx - validValues.begin(); 
    } 
} 

내가 gcc -c -std=c++0x으로이 컴파일을하고 나는이 오류가 발생합니다 :

CrmxFile.cpp: In member function ‘void CrmxFile::SetValue(std::string)’: 
CrmxFile.cpp:24:64: error: no match for ‘operator=’ in ‘idx = std::find [with _IIter = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >, _Tp = std::basic_string<char>](Id3V1::validValues.std::vector<_Tp, _Alloc>::begin [with _Tp = std::basic_string<char>, _Alloc = std::allocator<std::basic_string<char> >, std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_pointer = const std::basic_string<char>*](), Id3V1::validValues.std::vector<_Tp, _Alloc>::end [with _Tp = std::basic_string<char>, _Alloc = std::allocator<std::basic_string<char> >, std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_pointer = const std::basic_string<char>*](), (*(const std::basic_string<char>*)(& _value)))’ 
CrmxFile.cpp:24:64: note: candidates are: 
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note: __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >& __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >::operator=(const __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&) 
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note: no known conversion for argument 1 from ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’ to ‘const __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&’ 
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note: __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >& __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >::operator=(__gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&&) 
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note: no known conversion for argument 1 from ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’ to ‘__gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&&’ 

무엇이 누락 되었습니까? 또는, 벡터에서 주어진 값의 인덱스를 찾는 더 좋은 방법이 있습니까?

답변

5

idxvalidValues이 이기 때문에 const_iterator이어야합니다. validValues 이후

std::vector<std::string>::const_iterator idx; 
+0

아를 validValues.size를 사용하지 않을 :

나는 제안! 그게 다야, 고마워! –

1

const, begin(), end(), 따라서 std::find의 인스턴스는, 모든 std::vector<std::string>::iterator, std::vector<std::string>::const_iterator을하지 반환합니다. 보안 상 안전을 위해 const_iteratoriterator으로 변환 할 수 없습니다.

1

validValuesconst std::vector<std::string>으로 정의됩니다. 따라서 begin()end()const_iterator을 반환하지만 결과를 iterator에 할당하려고합니다. const_iteratoriterator으로 변환하면 const의 정확성이 깨질 수 있습니다 (기본 오브젝트를 계속 변경할 수 있으므로 허용되지 않습니다).

idx의 정의를 std::vector<std::string>::const_iterator으로 변경하면 올바르게 작동합니다.

1

"무엇이 없습니까?"

첫 번째 유효한 값이 유효하지 않습니까?

void Crmx::SetValue(std::string _value) { 

     value = std::find(validValues.begin(), validValues.end(), _value) - validValues.begin(); 

} 

을하고, 잘못된 값으로 0

+0

모든 값이 유효합니다. 0은 유효한 값이므로 0을 사용해야합니다. 입력이 유효한 값이 아닌 경우 기본값은 0입니다. @ipc는 올바른 답을 가지고 있습니다. –

관련 문제