运营商LT;<堆栈溢出

时间:2011-06-01 15:45:54

标签: c++ visual-studio-2010

请考虑以下代码:

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;
}

为什么在地球上:

  • Visual 2010是否在运营商<<
  • 中发出C4717 warning
  • 由于Visual?
  • 预测的堆栈溢出而导致std::cout << textMsgInstance;崩溃

顺便说一句,将m.text替换为m.text.c_str()有效。

3 个答案:

答案 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.textstd::string,它会在运算符内转换为TextMessage,然后再次调用运算符。