找不到operator =(在vector <string>中找到值)</string>的匹配项

时间:2013-01-08 17:55:14

标签: c++ vector find

我在这里明显遗漏了什么,但是什么?

定义(...表示有效代码,而非实际三点):

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> > >&&’

我错过了什么?或者,或者,有没有更好的方法来找到向量中给定值的索引?

4 个答案:

答案 0 :(得分:5)

idx必须是const_iterator,因为validValuesconst vector<...>

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

答案 1 :(得分:1)

由于validValuesconstbegin()end(),因此std::find的实例化全部返回std::vector<std::string>::const_iterator,而不是{{ 1}}。对于const-safety,std::vector<std::string>::iterator无法转换为const_iterator

答案 2 :(得分:1)

validValues定义为const std::vector<std::string>。因此,begin()end()将返回const_iterator,但您尝试将结果分配给iterator。将const_iterator转换为iterator会破坏const正确性(因为您可以继续并更改基础对象),因此不允许这样做。

idx的定义更改为std::vector<std::string>::const_iterator,它应该有效。

答案 3 :(得分:1)

“我错过了什么?”

你的第一个validValues无效吗?

我建议:

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

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

}

并使用validValues.size作为无效值,而不是0