2012-08-07 49 views
5

Ông có thể vui lòng giúp tôi với việc tìm kiếm một vấn đề trong đoạn mã sau (mã tương tự như C++ stream as a parameter when overloading operator<<):"lỗi: không phù hợp cho 'operator <<" khi làm việc với 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; 
} 

Mọi thứ hoạt động tốt cho đến khi tôi bỏ ghi chú dòng chứa "thế giới". Trong trường hợp này, GCC tạo ra lỗi : không khớp với 'toán tử < < ’trong ...

Điều thú vị là VS2008 không có vấn đề với mã này.

Cảm ơn bạn!

+0

Visual studio thực hiện rất nhiều loại chuyển đổi mà các trình biên dịch khác sẽ không thực hiện. Hãy thử std :: string ("world") .c_str(); – steveg89

Trả lời

12

std::string("world") tạo tạm thời không thể liên kết với tham chiếu không phải const. Thêm const vào tham số:

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

EDIT: Chỉ cần lưu ý rằng bạn đã đề cập điều này hoạt động trong MSVS. Đó là vì phần mở rộng ngôn ngữ MS, có thể được tắt và nó cũng sẽ hiển thị lỗi de. Bất cứ khi nào tôi sử dụng MSVS, tôi tắt tiện ích mở rộng ngôn ngữ.

+2

MSVC đã mở rộng C++ để có thể tạo các tham chiếu không phải 'const'. Điều này giải thích sự khác biệt giữa các trình biên dịch. Nó có thể vô hiệu hóa điều này với một tùy chọn trình biên dịch, nhưng sau đó có rất nhiều tiêu đề MS sẽ không hoạt động. –

+0

@MagnusHoff Tôi thậm chí còn không chú ý đến phần đó, nhưng bạn nói đúng. Tôi ghét những phần mở rộng đó. –

Các vấn đề liên quan