这个错误的原因大概是std::ios_base类的拷贝构造函数是私有的,从return s语句返回时缺少一个合成的构造拷贝构造函数完成流的复制。
错误代码示例:
#include <iostream>
#include <string>
struct Person {
std::string name;
Person(std::string n):name(n){}
};
// should return a reference to std::ostream
std::ostream operator<<(std::ostream& s,const Person &p) {
s << p.name;
return s;
}
int main() {
Person p(std::string("Tom"));
std::cout<<p<<std::endl;
}
重载输出操作符时,由于流对象不能复制,因此如果以值(by value)形式返回时,无法完成从s到std::osream的复制,因此导致上述错误。
解决方法是返回流的引用,即改变函数的返回类型为:std::ostream&即可。