在我的项目中,我使用了一个名为Message的类,它从std :: ostringstream继承来打印出其他类类型的可读信息。继承自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;
}
};
没有模板
MyTypeA a,b;
Message m;
m << a << "-" << b;
代码将不编译,为(M < <一个< < “ - ”)将返回一个ostringstream &这将不能够采取 'B' 。所以我使用模板来确保始终返回消息&。
我的问题:
Message m;
m << "Hello, world" << std::endl;
生成veeery长的编译器错误,我不知道为什么。
Here是我的问题的简约“不”可编译的例子,而here是相应的编译器输出。
这里是错误的关键部分:*不能推导出模板参数“T” * – chris
何不你是否实现了ostringstream&operator <<(ostringstream&os,const MyTypeA&a)'而不是? – pts
相关:http://stackoverflow.com/q/1134388/951890 –