错误:与“operator<”不匹配(操作数类型为“const A”和“const A”)

0 c++ oop constants operator-overloading set

#include <set>\n#include <iostream>\nusing namespace std;\n\ntemplate<class T> \nclass A \n{   \n    public:\n        A(T a = 0,T b =0): m_a(a),m_b(b) {}\n\n        bool operator<(const A& lhs)\n        {\n            /* compare code */\n        }\n              \n    private:\n        T m_a;\n        T m_b;   \n};  \n\nint main()   \n{\n    A<int> abc(2,3);\n\n    set<A<int>> P2D;\n    P2D.insert(abc);\n    return 0;   \n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行此代码时,出现以下错误

\n
\n

操作数类型为 \xe2\x80\x98const A\xe2\x80\x99 和 \xe2\x80\x98const A\xe2\x80\x99

\n
\n

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

\n
bool operator<(const A& lhs) const\n{\n    /*  compare code */\n}\n
Run Code Online (Sandbox Code Playgroud)\n

它没有给出错误,但是:

\n
    \n
  1. 我在这里缺少什么吗?
  2. \n
  3. 如果我不声明关键字,为什么会出错const
  4. \n
\n

Rem*_*eau 5

operator<需要这样做const,因为在内部setconst对象进行操作。

另外,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;   
}
Run Code Online (Sandbox Code Playgroud)

在线演示