error: no match for ‘operator<’ (operand types are ‘const A’ and ‘const A’)

error: no match for ‘operator<’ (operand types are ‘const A’ and ‘const A’)

#include <set>
#include <iostream>
using namespace std;

template<class T> 
class A 
{   
    public:
        A(T a = 0,T b =0): m_a(a),m_b(b) {}

        bool operator<(const A& lhs)
        {
            /* compare code */
        }
              
    private:
        T m_a;
        T m_b;   
};  

int main()   
{
    A<int> abc(2,3);

    set<A<int>> P2D;
    P2D.insert(abc);
    return 0;   
}

当我运行这段代码时,我得到以下错误

operand types are ‘const A’ and ‘const A’

如果我在重载上声明 const 关键字 operator<:

bool operator<(const A& lhs) const
{
    /*  compare code */
}

它没有报错,但是:

  1. 这里有什么我遗漏的吗?
  2. 如果我没有声明 const 关键字,为什么会报错?

您的 operator< 需要是 const,因为 set 在内部对 const 个对象进行操作。

此外,您的 operator< 无论如何都没有正确实施。它忽略比较左侧 A 对象的成员,它只查看右侧 A 对象的成员。

试试这个:

#include <set>
#include <iostream>
using namespace std;

template<class T> 
class A 
{   
    public:
        A(T a = T(), T b = T()): m_a(a), m_b(b) {}

        bool operator<(const A& rhs) const
        {
            return ((m_a < rhs.m_a) ||
                    ((m_a == rhs.m_a) && (m_b < rhs.m_b))
                   );
            /* alternatively:
            return std::tie(m_a, m_b) < std::tie(rhs.m_a, rhs.m_b);
            */
        }
              
    private:
        T m_a;
        T m_b;   
};  

int main()   
{
    A<int> abc(2,3);

    set<A<int>> P2D;
    P2D.insert(abc);
    return 0;   
}

Online Demo