2011-06-24 12 views
5

To jest denerwujące, mogę napisać funkcję z tymi parametrami/return, ale dlaczego nie mogę zdefiniować operatora, aby to zrobić?Dlaczego nie mogę używać dwóch ptr w przeciążeniu operatora?

-edit- w rzeczywistości próbuję przeciążać << poniżej jest tylko w celach informacyjnych.

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 błąd

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

Jaka jest Twoja rzeczywista sytuacja, dla której potrzebujesz tego porównania? –

+0

@Kerrek: Mój kod używa ostringstream. Teraz zdaję sobie sprawę, że potrzebuję stosu i aktualizacji o. Nie mogę używać referencyjnych referencji Bc, nie zmieniaj. Więc potrzebuję ptr. Napisałem już dużo kodu i chciałbym, aby << rhs kontynuował pracę. Wiele zmiennych rhs to także ptr. –

+0

Nie możesz zamiast tego napisać 'o << * rhs'? –

Odpowiedz

10

Ponieważ każdy operator musi przeciążeniowe zdefiniowane przez użytkownika co najmniej jeden typ zdefiniowany przez użytkownika jako parametr. Punkt nie jest typem zdefiniowanym przez użytkownika.

średnia

C++ 03 §13.5 [over.oper] p6:

Funkcja operator albo być nie-statyczne lub działanie element być funkcją nieczłonkowski i co najmniej jeden parametr, którego typ jest klasa odniesienie do klasy, wyliczenie lub odniesienie do wyliczenia.

+0

nadal, wskaźniki mogą MOGĄ być zawarte w tym. Ale postanowili tego nie robić. Chcę poznać racjonalność za tym. To utrudnia mi życie –

+0

Eh, jak oni mogli? Jak obliczyłoby to, że oba parametry są wskaźnikami? Istnieją wbudowane operatory, które obsługują wbudowane typy, wskaźniki są jednym z nich. – Xeo

+0

AFAIK '<<' nie znaczy nic dla 'T *'. A nawet gdyby tak było, chciałbym go przeciążyć.operatorzy są naprawdę funkcjami, funkcje mogą wykonywać to, o co proszę. -edit- wspomnę o używaniu mojego kodu w moim komentarzu na moje pytanie –

3

Ponieważ nie wolno ci oszukiwać.

Jeśli mógłbyś przesłonić operatorów porównania dla typów wskaźników, nie byłbyś w stanie porównywać tych wskaźników według wartości (aka: według rzeczywistych wartości liczbowych). I to jest ważne i czasami przydatne.

Mój prawdziwy kod to w rzeczywistości < <. Dlaczego nie mogę tego użyć?

Z tego samego powodu: wskaźniki to C++ - podstawowe typy. Nie są to typy zdefiniowane przez użytkownika. Czy chcesz móc już nie zmieniać wartości wskaźnika przesunięcia w lewo? OK, oczywiście, że tak, ale C++ ci nie pozwoli.

Można tylko przesłonić operatorów, gdy C++ nie ma istniejących funkcji dla operatorów z tymi typami (z kilkoma wyjątkami). C++ ma już operatora < i operatora < < dla wskaźników, więc nie możesz zmieniać tego, co robią.

+1

Nie sądzę, że możesz zmienić wskaźniki! –

+0

Może to operator ostream ... – Nemo

+0

@Nemo ... ale "ostream's <<" działa na ... –

Powiązane problemy