Почему я не могу использовать два ptrs в перегрузке оператора? - PullRequest
5 голосов
/ 25 июня 2011

Это раздражает, я могу написать функцию с этими параметрами / возвратом, но почему я не могу определить оператор для этого?

-edit- я на самом деле пытаюсь перегрузить << нижепросто для справки.

Из 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

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

Ответы [ 2 ]

10 голосов
/ 25 июня 2011

Поскольку для каждой пользовательской перегрузки оператора требуется как минимум один пользовательский тип в качестве параметра. Точка не является пользовательским типом.

C ++ 03 стандарт, §13.5 [over.oper] p6:

Операторная функция должна быть либо нестатической функцией-членом, либо функцией, не являющейся членом и иметь по крайней мере один параметр, тип которого является классом, ссылкой на класс, перечислением или ссылкой на перечисление .

3 голосов
/ 25 июня 2011

Поскольку вы не можете обманывать.

Если бы вы могли переопределить операторы сравнения для типов указателей, то вы больше не сможете сравнивать эти указатели по значению (иначе: по фактическим числовым значениям указателя).).И это очень важно и иногда полезно.

Мой настоящий код - <<.Почему я не могу использовать его для этого? </p>

По той же причине: указатели - это C ++ - базовые типы.Они не являются пользовательскими типами.Вы хотите иметь возможность больше не указывать значения указателя влево?Хорошо, конечно, вы делаете, но C ++ не позволит вам.

Вы можете переопределить операторы, только если C ++ не имеет существующей функциональности для операторов с этими типами (за некоторыми исключениями).В C ++ уже есть операторы <и оператор << для указателей, поэтому вы не можете изменять то, что они делают. </p>

...