为什么我不能在运算符重载中使用两个ptrs?

时间:2011-06-24 23:19:13

标签: c++ operator-overloading compiler-errors

这很烦人,我可以用这些参数写一个函数/ return,但为什么我不能定义一个运算符来做这个呢?

-edit-我实际上是在尝试重载<<以下仅供参考。

From msdn

// C2803.cpp
// compile with: /c
class A{};
bool operator< (const A *left, const A *right);   // C2803
// try the following line instead
// bool operator< (const A& left, const A& right);

gcc错误

error: ‘bool operator<(const A*, const A*)’ must have an argument of class or enumerated type

2 个答案:

答案 0 :(得分:10)

因为每个用户定义的运算符重载都需要至少一个用户定义的类型作为参数。点不是用户定义的类型。

C ++ 03标准,§13.5 [over.oper] p6

  

运算符函数应该是非静态成员函数或者是非成员函数,并且至少有一个类型为类的参数,对类的引用,枚举或对枚举

答案 1 :(得分:3)

因为你不允许作弊。

如果您可以覆盖指针类型的比较运算符,那么您将无法再按值(也就是:通过实际数字指针值)比较这些指针。这很重要,偶尔也很有用。

  

我的真实代码实际上是&lt;&lt;。为什么我不能用它?

出于同样的原因:指针是C ++ - 基本类型。它们不是用户定义的类型。你想不能再左移指针值吗?好的,显然你这样做,但C ++不会让你。

当C ++没有具有这些类型的运算符的现有功能时(除少数例外),您只能覆盖运算符。 C ++已经有了运算符&lt;和运算符&lt;&lt;对于指针,所以你不能改变他们的行为。