C++ 未找到运算符=(在向量<;字符串>;中查找值)的匹配项

C++ 未找到运算符=(在向量<;字符串>;中查找值)的匹配项,c++,vector,find,C++,Vector,Find,很明显我遗漏了什么,但是什么 定义(…表示有效代码,而不是实际的三点): 我错过了什么?或者,有没有更好的方法来查找向量中给定值的索引?idx必须是const\u迭代器,因为validValues是const向量 std::vector::const_迭代器idx; 由于有效值是常量,开始(),结束(),因此std::find的这个实例化都返回std::vector::const_迭代器,而不是std::vector::iterator。为了常量安全起见,常量迭代器不能转换为迭代器有效值定义为c

很明显我遗漏了什么,但是什么

定义(
表示有效代码,而不是实际的三点):


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

idx
必须是
const\u迭代器,因为
validValues
const向量

std::vector::const_迭代器idx;

由于
有效值
常量
开始()
结束()
,因此
std::find
的这个实例化都返回
std::vector::const_迭代器
,而不是
std::vector::iterator
。为了常量安全起见,
常量迭代器
不能转换为
迭代器

有效值
定义为
const std::vector
。因此,
begin()
end()
将返回
const\u迭代器
,但您正试图将结果分配给
迭代器
。将
常量迭代器
转换为
迭代器
将破坏常量的正确性(因为您可以继续并更改基础对象),因此是不允许的

idx
的定义更改为
std::vector::const_迭代器
,它应该可以工作。

“我缺少什么?”

您的第一个有效值是否无效

我建议:

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

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

}

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

所有值均有效。我需要使用0,因为0是一个有效值。如果输入不是有效输入之一,则要求默认为0@ipc有正确的答案——它对我有效。
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();
    }
}
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> > >&&’
std::vector<std::string>::const_iterator idx;
void Crmx::SetValue(std::string _value) {

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

}