C++ lambda 函数中的“运算符=不匹配”错误
C++ “no match for operator=“ error in lambda function
我在非静态类成员函数中有一个lambda函数,用于std::find。
//Somewhere in the header...
Gtk::ComboBoxText *optionChoiceComboBoxText = nullptr; // Initialized later in code
std::vector<OptionData> optionList;
int currentOptionPositionInList = -1;
// In Interface.cpp
Interface::optionChangedHandler() {
currentOptionPositionInList = std::distance(optionList.begin(),
find(optionList.begin(), optionList.end(), [&](OptionData const& o) {
std::string s = optionChoiceComboBoxText->get_active_text();
return s == o.name;
})); //Error is here
}
这是注释的错误:
[ 66%] Building CXX object CMakeFiles/RNS.dir/src/GUI/Interface.cpp.o
In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iterator:64,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/bits/predefined_ops.h: In instantiation of ‘bool __gnu_cxx::__ops::_Iter_equals_val<_Value>::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator<OptionData*, std::vector<OptionData> >; _Value = const Interface::optionChangedHandler()::<lambda(const OptionData&)>]’:
/usr/include/c++/5/bits/stl_algo.h:120:14: required from ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<OptionData*, std::vector<OptionData> >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const Interface::optionChangedHandler()::<lambda(const OptionData&)> >]’
/usr/include/c++/5/bits/stl_algo.h:161:23: required from ‘_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator<OptionData*, std::vector<OptionData> >; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const Interface::optionChangedHandler()::<lambda(const OptionData&)> >]’
/usr/include/c++/5/bits/stl_algo.h:3790:28: required from ‘_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = __gnu_cxx::__normal_iterator<OptionData*, std::vector<OptionData> >; _Tp = Interface::optionChangedHandler()::<lambda(const OptionData&)>]’
/home/crefrod/RNS/src/GUI/Interface.cpp:70:50: required from here
/usr/include/c++/5/bits/predefined_ops.h:194:17: error: no match for ‘operator==’ (operand types are ‘OptionData’ and ‘const Interface::optionChangedHandler()::<lambda(const OptionData&)>’)
{ return *__it == _M_value; }
^
In file included from /usr/include/c++/5/iterator:63:0,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/bits/stl_iterator.h:820:5: note: candidate: template<class _IteratorL, class _IteratorR, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)
operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
^
/usr/include/c++/5/bits/stl_iterator.h:820:5: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iterator:64,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/bits/predefined_ops.h:194:17: note: ‘OptionData’ is not derived from ‘const __gnu_cxx::__normal_iterator<_IteratorL, _Container>’
{ return *__it == _M_value; }
^
In file included from /usr/include/c++/5/iterator:63:0,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/bits/stl_iterator.h:827:5: note: candidate: template<class _Iterator, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)
operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
^
/usr/include/c++/5/bits/stl_iterator.h:827:5: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iterator:64,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/bits/predefined_ops.h:194:17: note: ‘OptionData’ is not derived from ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’
{ return *__it == _M_value; }
^
In file included from /usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h:33:0,
from /usr/include/c++/5/bits/allocator.h:46,
from /usr/include/c++/5/string:41,
from /usr/include/c++/5/bits/locale_classes.h:40,
from /usr/include/c++/5/bits/ios_base.h:41,
from /usr/include/c++/5/ios:42,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iterator:64,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/ext/new_allocator.h:139:5: note: candidate: template<class _Tp> bool __gnu_cxx::operator==(const __gnu_cxx::new_allocator<_Tp>&, const __gnu_cxx::new_allocator<_Tp>&)
operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
^
/usr/include/c++/5/ext/new_allocator.h:139:5: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
from /usr/include/c++/5/bits/char_traits.h:39,
from /usr/include/c++/5/ios:40,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iterator:64,
from /usr/include/glibmm-2.4/glibmm/ustring.h:29,
from /usr/include/glibmm-2.4/glibmm/exception.h:25,
from /usr/include/glibmm-2.4/glibmm/error.h:23,
from /usr/include/glibmm-2.4/glibmm/thread.h:49,
from /usr/include/glibmm-2.4/glibmm.h:87,
from /usr/include/giomm-2.4/giomm.h:23,
from /home/crefrod/RNS/src/GUI/Interface.cpp:5:
/usr/include/c++/5/bits/predefined_ops.h:194:17: note: ‘OptionData’ is not derived from ‘const __gnu_cxx::new_allocator<_Tp>’
{ return *__it == _M_value; }
因此,看起来编译器试图将OptionData
分配给lambda本身(或‘const Interface::optionChangedHandler()::<lambda(const OptionData&)>’
的内容(。但我不明白 OptionData 从何而来,因为 OptionData.name
和 s
都是 std::string's。
您需要
将std::find
替换为std::find_if
。
std::find
有签名find( InputIt first, InputIt last, const T& value )
,它认为你正在传递你的lambda作为类型T
,这就是为什么它试图将你的lambda转换为OptionData
并感到不安
相关文章:
- 在使用累加时,C++中的运算符+不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- 映射迭代器与运算符不匹配
- 与"运算符>>"不匹配(操作数类型为"QDataStream"和"QJsonObject")
- 与标准中的"运算符<<"不匹配
- 运算符不匹配*=
- 不断收到错误" 与"运算符>>不匹配";
- 编译我的 3 个文件时,我收到错误,说"运算符="不匹配
- C++ 模板与运算符<不匹配
- 与"运算符="不匹配
- 代码块编译错误与运算符<<不匹配
- 错误:运算符 [] 不匹配。在比较列表中的 int 和 int 时<int>,
- 解决错误:运算符 [] 不匹配
- 错误:与"运算符>>"不匹配(操作数类型为"std::istream
- 与"运算符[]"不匹配(操作数类型为"std::unique_ptr<std::vector<int> >"和"int")
- 错误:与“运算符 []”不匹配
- 与"运算符<<不匹配
- 错误:与"运算符[]"不匹配(操作数类型为"QVector<int>"和"QCharRef")
- 错误:"运算符>>"不匹配 重载 istream 运算符