2010-02-25 9 views
6

estoy tratando de sobrecargar el operador coma con una función no miembro no amigo así:¿Por qué no se llama a mi operador de coma sobrecargado?

#include <iostream> 
using std::cout; 
using std::endl; 

class comma_op 
{ 
    int val; 

public: 
    void operator,(const float &rhs) 
    { 
     cout << this->val << ", " << rhs << endl; 
    } 
}; 

void operator,(const float &lhs, const comma_op &rhs) 
{ 
    cout << "Reached!\n";  // this gets printed though 
    rhs, lhs;     // reversing this leads to a infinite recursion ;) 
} 

int main() 
{ 
    comma_op obj; 
    12.5f, obj; 

    return 0; 
} 

Básicamente, estoy tratando de conseguir el operador coma utilizable por ambos lados, con un flotador. Tener una función de miembro solo me permite escribir obj, float_val, mientras que tener una función adicional de ayuda no miembro no amigo me permite escribir float_val, obj; pero la función de operador miembro no se llama.

GCC grita:

comma.cpp: In function ‘void operator,(const float&, const comma_op&)’: 
comma.cpp:19: warning: left-hand operand of comma has no effect 
comma.cpp:19: warning: right-hand operand of comma has no effect 


Nota:. Soy consciente de que la sobrecarga de operadores, que también sobrecargar op coma, es confuso y no es en absoluto aconsejable desde el punto de vista de un purista. Estoy aprendiendo los matices de C++ aquí.

+2

Como un punto de estilo, creo que generalmente se considera imprudente redefinir el significado de los operadores, ya que eso lleva a un código difícil de mantener: es a * b haciendo una multiplicación o ha sido redefinido como un vector cruzado ¿producto? (Algunos dirían que uno está bien.) – Skizz

+0

@Skizz: supongo que te has perdido la cuenta, lo que he mencionado en el _Nota_ desde el principio de esta publicación. – legends2k

+0

y la sobrecarga de coma a menudo es especialmente problemático debido a su baja precedencia –

Respuesta

19
void operator,(const float &rhs) 

Necesita un const aquí.

void operator,(const float &rhs) const { 
    cout << this->val << ", " << rhs << endl; 
} 

La razón es porque

rhs, lhs 

llamaremos

rhs.operator,(lhs) 

Desde rhs es una const comma_op&, el método debe haber un método const. Pero solo proporciona un constoperator,, por lo que se usará la definición predeterminada.

+0

¡Oh, const correcto! Sí, funciona ahora, gracias :) – legends2k

Cuestiones relacionadas