2012-08-07 37 views
5

¿Me podría ayudar a encontrar un problema en el código siguiente (código es similar al C++ stream as a parameter when overloading operator<<):"error: no puede competir con 'operador <<" cuando se trabaja con std :: string

#include <iostream> 
#include <string> 

class logger 
{ 
    public: 
    void init(std::ostream& ostr) 
    { 
     stream = &ostr; 
    } 

    template< typename t > 
    logger& operator <<(t& data) 
    { 
     *stream << data; 
     return *this; 
    } 

    logger& operator <<(std::ostream& (*manip)(std::ostream &)) 
    { 
     manip(*stream); 
     return *this; 
    } 

    logger& operator <<(std::ios_base& (*manip)(std::ios_base&)) 
    { 
     manip(*stream); 
     return *this; 
    } 

    private: 
    std::ostream* stream; 
}; 

int main(int argc, char* argv[]) 
{ 
    logger log; 
    log.init(std::cout); 
    log << "Hello" << std::endl; 
    //log << std::string("world") << std::endl; 

    return 0; 
} 

Todo funciona bien hasta que descomente la línea que contiene "mundo". En este caso, GCC produce el error : no coincide con el 'operador < <' en ...

Es interesante que VS2008 no tenga ningún problema con este código.

¡Gracias!

+0

Visual Studio hace una gran cantidad de conversiones de tipo que otros compiladores no harán. Pruebe std :: string ("world") .c_str(); – steveg89

Respuesta

12

std::string("world") crea un temporal que no se puede enlazar a una referencia no constante. Agregue const a los parámetros:

template< typename t > 
logger& operator <<(t const& data) 
{ 
    *stream << data; 
    return *this; 
} 

EDIT: Acabo de notar que usted mencionó que esto funciona en MSVS. Eso se debe a las extensiones de lenguaje MS, que se pueden desactivar y también mostrará un error. Cada vez que uso MSVS, desactivo las extensiones de idioma.

+2

MSVC ha extendido C++ para poder hacer referencias no contenidas. Esto explica la discrepancia entre los compiladores. Es posible desactivar esto con una opción de compilación, pero luego hay muchos encabezados de MS que no funcionarán. –

+0

@MagnusHoff Ni siquiera noté esa parte, pero tienes razón. Odio esas extensiones –

Cuestiones relacionadas