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 */
}
它没有报错,但是:
- 这里有什么我遗漏的吗?
- 如果我没有声明
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;
}
#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 */
}
它没有报错,但是:
- 这里有什么我遗漏的吗?
- 如果我没有声明
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;
}