2011-06-24 8 views
5

Esto es molesto, puedo escribir una función con estos parámetros/retorno, pero ¿por qué no puedo definir un operador para hacer esto?¿Por qué no puedo usar dos ptrs en la sobrecarga del operador?

-editar- en realidad estoy tratando de sobrecargar << a continuación es sólo como referencia.

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); 

error gcc

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

¿Cuál es su situación real para la que necesita esa comparación? –

+0

@Kerrek: Mi código está usando ostringstream. Ahora me doy cuenta de que necesito una pila y actualizar o. No puedo usar las referencias de referencia de bc. No cambio. Entonces necesito un ptr. Ya escribí un montón de código y me gustaría que o << rhs continúe trabajando. Muchos rhs vars también son ptrs –

+0

¿No puedes escribir 'o << * rhs' en su lugar? –

Respuesta

10

Debido a las necesidades de cada operador de sobrecarga definidos por el usuario al menos una definida por el usuario tipo como un parámetro. Un punto no es un tipo definido por el usuario.

C++ 03 estándar, §13.5 [over.oper] p6:

Una función de operador deberá ser una función miembro no estática o ser una función no miembro y tener al menos un parámetro cuyo tipo es una clase, una referencia a una clase, una enumeración o una referencia a una enumeración.

+0

todavía, los punteros PODRÍAN incluirse en eso. Pero ellos decidieron no hacerlo. Quiero saber el racional detrás de eso. Está haciendo mi vida más difícil –

+0

Eh, ¿cómo podrían? ¿Cómo resultaría que ambos parámetros fueran punteros? Hay operadores integrados que manejan los tipos integrados, los punteros son uno de ellos. – Xeo

+0

AFAIK '<<' no significa nada para 'T *'. E incluso si lo hiciera, ME GUSTARÍA sobrecargarlo.los operadores son realmente funciones, las funciones pueden hacer lo que solicite. -edit- menciono el uso de mi código en mi comentario sobre mi pregunta –

3

Porque no está permitido hacer trampas.

Si puede anular operadores de comparación para tipos de puntero, entonces ya no podrá comparar esos punteros por valor (también conocido como: por los valores de puntero numéricos reales). Y eso es algo importante y ocasionalmente útil.

Mi código real es en realidad < <. ¿Por qué no puedo usarlo para eso?

Por la misma razón: los punteros son C++ - tipos básicos. No son tipos definidos por el usuario. ¿Desea ya no poder desplazar hacia la izquierda los valores del puntero? OK, obviamente lo haces, pero C++ no te lo permite.

Solo puede anular operadores cuando C++ no tiene funcionalidad existente para operadores con esos tipos (con algunas excepciones). C++ ya tiene el operador < y el operador < < para los punteros, por lo que no está permitido cambiar lo que hacen.

+1

¡No creo que puedas cambiar los punteros de todos modos! –

+0

Tal vez sea el operador ostream ... – Nemo

+0

@Nemo ... pero "ostream's <<" funciona en ... –

Cuestiones relacionadas