与'operator&lt;&lt;'不匹配在std :: operator&lt;&lt; [使用_Traits = std :: char_traits <char>] </char>

时间:2011-01-31 08:06:30

标签: c++

我有一个带字符串转换运算符的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)?

解决此问题的'最佳实践'方法是什么,所以我不必使用上面的丑陋语法?

1 个答案:

答案 0 :(得分:6)

Foobar fb在放入您的流之前未转换为字符串。没有要求&lt;&lt;&lt;&lt;&lt;&lt;&lt;运算符必须是字符串。

您应该手动将其转换为字符串

ss << "Foobar is: " << std::string(fb);

或定义一个运算符&lt;&lt;对于Foobar。

定义运算符&lt;&lt;这将是一个聪明的方法,并且没有理由你不能在你的运算符中调用你的字符串转换&lt;&lt;代码。