我有一个带字符串转换运算符的Foobar类:
#include <string>
class Foobar
{
public:
Foobar();
Foobar(const Foobar&);
~Foobar();
operator std::string() const;
};
我试图像这样使用它:
// C ++源文件
#include <iostream>
#include <sstream>
#include "Foobar.hpp"
int main()
{
Foobar fb;
std::stringstream ss;
ss << "Foobar is: " << fb; // Error occurs here
std::cout << ss.str();
}
我是否需要显式创建运算符&lt;&lt;对于Foobar?我不明白为什么这是必要的,因为FooBar在放入iostream之前被转换为字符串,而std :: string已经有了运算符&lt;&lt;定义
那么为什么会出现这个错误?我错过了什么?
[编辑]
我刚刚发现,如果我更改了该行,就会发生错误:
ss << "Foobar is: " << fb.operator std::string();
它成功编译。呃......!为什么编译器不能进行自动转换(Foobar - &gt; string)?
解决此问题的'最佳实践'方法是什么,所以我不必使用上面的丑陋语法?
答案 0 :(得分:6)
Foobar fb在放入您的流之前未转换为字符串。没有要求&lt;&lt;&lt;&lt;&lt;&lt;&lt;运算符必须是字符串。
您应该手动将其转换为字符串
ss << "Foobar is: " << std::string(fb);
或定义一个运算符&lt;&lt;对于Foobar。
定义运算符&lt;&lt;这将是一个聪明的方法,并且没有理由你不能在你的运算符中调用你的字符串转换&lt;&lt;代码。