c++ - 为什么 std::list 的相等比较不能通过编译而 T 是 EqualityComparable

标签 c++ list stl equality

我需要比较两个列表是否相等,所以我在我的 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 — 容器要求

enter image description here

为什么会出现以下编译错误,使我无法比较两个列表?

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/

相关文章:

c++ - 为什么我不能用谓词的实例化构造 std::set,但我可以分配以这种方式构造的 std::set?

c++:应用于 vector 的STL算法也适用于其他容器对象?

c++ - 在 C++ 中,它是从小数点开始还是从整个 #setprecision 开始

c++ - 字谜程序测试

c++ - 使用基于编译器的 cmake 条件 CXX_FLAGS?

C# List<Object>.Equals 对象比较失败

c++ - 在 solaris 中编译 std::count() 时出错

c++ - posix_spawn 创建一个僵尸进程并返回成功

python - 从一组整数中随机采样

c# - 从 List<Dictionary<string, long>> 中查找值