继承自std :: ostringstream

rra*_*alf 2 c++ templates stringstream

在我的项目中,我使用一个名为Message的类,它继承自std :: ostringstream,打印出其他类类型的人类可读信息.

所以它的<<运算符多次重载我自己的类类型,我想打印出来.

class Message : public ostringstream
{
public:
    Message() {};
    virtual ~Message() {};

    Message& operator <<(const MyTypeA &a) { return *this << a.getStr(); };
    Message& operator <<(const MyTypeB &b) { return *this << b.identifier(); };
    Message& operator <<(const MyTypeC &c) { return *this << c.foo(); };

    // Pass everything unknown down to ostringstream, and always return a Message&
    template<class T>
    Message& operator <<(const T &t)
    {
        (std::ostringstream&)(*this) << t;
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

没有模板

MyTypeA a,b;
Message m;
m << a << "-" << b;
Run Code Online (Sandbox Code Playgroud)

代码不会编译,因为(m << a <<" - ")将返回一个ostringstream并且无法取'b'.所以我使用模板确保始终返回Message&.

我的问题:

Message m;
m << "Hello, world" << std::endl;
Run Code Online (Sandbox Code Playgroud)

生成一个veeery长编译器错误,我不知道为什么.

是我的问题的简约"不"可编译示例,这里是相应的编译器输出.

Die*_*ühl 8

难道不是从任何流类派生来创建一个新的流!导出std::ostreamstd::istream创建流的唯一原因是正确设置为使用合适的流缓冲区.您应该派生自std::streambuf创建新的源或目标,而不是从流派生.要为新类型创建输出运算符,您将作为第一个参数重载operator<<(),std::ostream&将自定义类型重载为第二个参数.同样地std::istream&.

顺便说一句,你遇到的问题是因为std::endl是一个功能模板.尝试在某处传递函数模板需要可以推导出适当的实例化.由于输出运算符不包含合适的签名,std::endl因此无法推断实例化.我可以说明需要什么,但这是毫无意义的,因为无论如何都是错误的方式.