请考虑以下代码:
class TextMessage{
public :
TextMessage(){};
TextMessage(std::string _text):text(_text){}
std::string text;
friend std::ostream & operator<<( std::ostream & os, const TextMessage & m);
};
std::ostream & operator<<( std::ostream & os, const TextMessage & m){
return os << "text message : " << m.text;
}
为什么在地球上:
<<
std::cout << textMsgInstance;
崩溃
顺便说一句,将m.text
替换为m.text.c_str()
有效。
答案 0 :(得分:14)
我猜你没有#include <string>
。因此,当编译器输出std::string
时,它不能,并开始寻找隐式转换 - 并且您对TextMessage的隐式构造函数看起来就像账单。但是等等 - 现在我们在TextMessage的输出函数和bam中输出一个TextMessage。
答案 1 :(得分:6)
我唯一能想到的是它没有运算符&lt;&lt;对于std :: string,它会查找转换并找到一个参数构造函数TextMessage(std :: string)。
通常建议通过将它们显式化来防止对一个参数构造函数的意外调用。
explicit TextMessage(std::string _text):text(_text){}
然后它不会考虑隐式转换的构造函数。
答案 2 :(得分:3)
因为m.text
是std::string
,它会在运算符内转换为TextMessage
,然后再次调用运算符。