我需要比较两个列表是否相等,所以我在我的 VS2005 项目中写下了以下代码
#include <list>
class sitesInfo
{
public:
bool operator==(const sitesInfo &rh)
{
return this->a == rh.a;
}
private:
int a;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::list<sitesInfo> list1;
std::list<sitesInfo> list2;
bool ret = (list1 == list2);
return 0;
}
这里的sitesInfo
是EqualityComparable,这是c++标准要求的:
表 96 — 容器要求
为什么会出现以下编译错误,使我无法比较两个列表?
vs2005\vc\include\xutility(2476) : error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const sitesInfo' (or there is no acceptable conversion)
d:\my documents\visual studio 2005\projects\test\test\test.cpp(10): could be 'bool sitesInfo::operator ==(const sitesInfo &)'
while trying to match the argument list '(const sitesInfo, const sitesInfo)'
1> e:\program files\vs2005\vc\include\xutility(2602) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Mismatch<_InIt1,_InIt2,std::forward_iterator_tag>(_InIt1,_InIt1,_InIt2,_InItCats,std::_Range_checked_iterator_tag)' being compiled
with
[
_Ty1=std::list<sitesInfo>::_Const_iterator<false>,
_Ty2=std::list<sitesInfo>::_Const_iterator<true>,
_InIt1=std::list<sitesInfo>::_Const_iterator<false>,
_InIt2=std::list<sitesInfo>::_Const_iterator<true>,
_InItCats=std::forward_iterator_tag
]
e:\program files\vs2005\vc\include\xutility(2674) : see reference to function template instantiation 'bool std::_Equal<std::list<_Ty>::_Const_iterator<_Secure_validation>,_InIt2,std::_Iter_random_helper<_Cat1,_Cat2>::_Iter_random_cat>(_InIt1,_InIt1,_InIt2,_InItCats,std::_Range_checked_iterator_tag)' being compiled
with
_Ty=sitesInfo,
_Secure_validation=false,
_InIt2=std::list<sitesInfo>::_Const_iterator<true>,
_Cat1=std::list<sitesInfo>::_Const_iterator<true>::iterator_category,
_Cat2=std::list<sitesInfo>::_Const_iterator<true>::iterator_category,
_InIt1=std::list<sitesInfo>::_Const_iterator<false>,
_InItCats=std::_Iter_random_helper<std::list<sitesInfo>::_Const_iterator<true>::iterator_category,std::list<sitesInfo>::_Const_iterator<true>::iterator_category>::_Iter_random_cat
]
e:\program files\vs2005\vc\include\list(1261) : see reference to function template instantiation 'bool std::equal<std::list<_Ty>::_Const_iterator<_Secure_validation>,std::list<_Ty>::_Const_iterator<_Secure_validation>>(_InIt1,_InIt1,_InIt2)' being compiled
with
[
_Ty=sitesInfo,
_Secure_validation=true,
_InIt1=std::list<sitesInfo>::_Const_iterator<true>,
_InIt2=std::list<sitesInfo>::_Const_iterator<true>
]
d:\my documents\visual studio 2005\projects\test\test\test.cpp(23) : see reference to function template instantiation 'bool std::operator ==<sitesInfo,std::allocator<_Ty>>(const std::list<_Ty> &,const std::list<_Ty> &)' being compiled
with
[
_Ty=sitesInfo
]
我只能通过定义一个参数类型为const sitesInfo&
的全局operator==
来编译它
bool operator==(const sitesInfo &rh, const sitesInfo &rs)
最佳答案
您的成员 operator==
的问题是它没有标记为 const
。当 std::list
检查两个 const
元素是否相等时。这意味着您的 operator==
将被忽略,因为它未标记为 const
,因此无法在 const
对象上调用它。
为了解决这个问题,我们只需将函数标记为const
,例如
bool operator==(const sitesInfo &rh) const
{
return this->a == rh.a;
}
现在它将compile and run
自由函数的工作原理是自由函数没有 const
限定,它需要两个 const
对象。如果你有
bool operator==(sitesInfo &rh, sitesInfo &rs)
然后将无法编译,因为您正试图删除对象的常量性。
关于c++ - 为什么 std::list 的相等比较不能通过编译而 T 是 EqualityComparable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116865/