2012-08-07 17 views
5

mógłbyś mi pomóc w znalezieniu problemu w następującym kodzie (kod jest podobny do C++ stream as a parameter when overloading operator<<):„Błąd: nie pasuje do„operator <<”podczas pracy z 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; 
} 

Wszystko działa dobrze, dopóki nie odkomentuję linii zawierającej "świat". W takim przypadku GCC generuje błąd : brak dopasowania dla "operatora < <" w ...

To interesujące, że VS2008 nie ma problemu z tym kodem.

Dziękujemy!

+0

Visual Studio wykonuje wiele konwersji typów, których nie wykonają inne kompilatory. Spróbuj std :: string ("world") .c_str(); – steveg89

Odpowiedz

12

std::string("world") tworzy tymczasowy dokument, który nie może zostać powiązany z odwołaniem do niego. Dodaj const do parametrów:

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

EDYCJA: Właśnie zauważyłem, że wspomniałeś to działa w MSVS. Dzieje się tak z powodu rozszerzeń językowych MS, które można wyłączyć, a także pokazać błąd. Ilekroć używam MSVS, wyłączam rozszerzenia językowe.

+2

MSVC rozszerzyło C++, aby móc tworzyć referencje inne niż 'constst'. To wyjaśnia rozbieżność między kompilatorami. Można to wyłączyć za pomocą opcji kompilatora, ale istnieje wiele nagłówków MS, które nie będą działać. –

+0

@MagnusHoff Nawet nie zauważyłem tej części, ale masz rację. Nienawidzę tych rozszerzeń. –

Powiązane problemy