2011-06-25 19 views
6

Me pregunto. Me tocó un problema y aquí hay un pequeño repoduce. Esencialmente quiero reenviar todo. El problema es que usar el primer < < causará un error con o<<1 (o o<<SomeUserStruct(). Si incluyo el segundo recibo errores acerca de que sea ambiguo. ¿Hay alguna forma de que pueda escribir este código para que use T& cuando de lo contrario utiliza T?reenviar una clase completa con un operador

#include <iostream> 
struct FowardIt{ 
    template<typename T> FowardIt& operator<<(T&t) { std::cout<<t; return *this; } 
    //template<typename T> FowardIt& operator<<(T t) { std::cout<<t; return *this; } 
}; 

struct SomeUserStruct{}; 

int main() { 
    FowardIt o; 
    o << "Hello"; 
    int i=1; 
    o << i; 
    o << 1; 
    o << SomeUserStruct(); 
} 

Respuesta

10
template<typename T> FowardIt& operator<<(const T&t) 
             //^^^^^ put const here 

hacer que la referencia de parámetro const, como se muestra arriba. Debido a que los temporales no pueden ser obligados a referencia no const. no es necesario definir otra función. al igual que el parámetro const, el problema será resuelto.

También sería mejor si usted hace la plantilla de función const así poniendo const hacia el lado de la derecha de la función como:

template<typename T> 
const FowardIt& operator<<(const T&t) const 
^^^^^      ^^^^^  ^^^^^ 
    |       |   | 
    |       |   put const here as well 
    |       put const here 
    | 
    You've to make the return-type also const 
    since it can't return non-const reference anymore 

Si lo hace, entonces se puede llamar a esta función en const objetos también:

void f(const FowardIt &o)//note: inside the function, o is an const object! 
{ 
    o << 1; 
    o << SomeUserStruct(); 
} 
+0

Excelente respuesta. Sin embargo, si hago el método const, tengo que hacer la const de retorno también. Lo cual sería ilógico (para transmisiones regulares). –

+0

@ acidzombie24: sí. ¡También agregué esto! – Nawaz

+0

¿Tiene alguna idea de cuál es el problema con esto? http://www.ideone.com/fWVG4 hex funciona así que sabemos que las funciones están siendo avanzadas. Sin embargo, endl no es. –

Cuestiones relacionadas