Tôi hiện đang viết trình bao bọc cho số std::stringstream
và tôi muốn chuyển tiếp tất cả các cuộc gọi operator<<
qua lớp học của tôi tới số std::stringstream
. Điều này hoạt động tốt ngay bây giờ (nhờ câu hỏi này: wrapper class for STL stream: forward operator<< calls), nhưng vẫn còn một vấn đề với nó.Lớp trình bao bọc C++ cho iostream, sử dụng công cụ sửa đổi luồng như std :: endl với toán tử <<
Hãy nói rằng tôi có đoạn mã sau:
class StreamWrapper {
private:
std::stringstream buffer;
public:
template<typename T>
void write(T &t);
template<typename T>
friend StreamWrapper& operator<<(StreamWrapper& o, T const& t);
// other stuff ...
};
template<typename T>
StreamWrapper& operator<<(StreamWrapper& o, T const& t) {
o.write(t);
return o;
}
template<typename T>
void StreamWrapper::write(T& t) {
// other stuff ...
buffer << t;
// other stuff ...
}
Nếu bây giờ tôi làm điều này:
StreamWrapper wrapper;
wrapper << "text" << 15 << "stuff";
này hoạt động tốt. Nhưng nếu tôi muốn sử dụng các công cụ sửa đổi luồng như std::endl
, là một chức năng theo http://www.cplusplus.com/reference/ios/endl, tôi chỉ đơn giản là không biên dịch.
StreamWrapper wrapper;
wrapper << "text" << 15 << "stuff" << std::endl;
Tại sao? Tôi có thể chuyển tiếp các công cụ sửa đổi luồng như thế nào?
Lỗi biên dịch là gì? –
Có quá tải của toán tử << 'có chức năng, và sau đó gọi hàm đó trên luồng: http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt http: //en.cppreference .com/w/cpp/io/manip – BoBTFish