operator<< stackoverflow
operator<< stackoverflow
考虑以下代码:
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警告 std::cout << textMsgInstance;
是否如Visual预测的那样通过stackoverflow崩溃
顺便说一下,用m.text.c_str()
代替m.text
是可行的。
我猜您#include <string>
失败了。因此,当编译器输出std::string
时,它不能,并开始寻找隐式转换——而TextMessage的隐式构造函数看起来就像是账单。但是等一下,现在我们在TextMessage的输出函数中输出一个TextMessage,然后bam。
我唯一能想到的是它没有运算符<lt;对于std::string,它查找转换并找到单参数构造函数TextMessage(std::字符串)。
通常建议通过显式调用单参数构造函数来防止意外调用。
explicit TextMessage(std::string _text):text(_text){}
然后它将不考虑隐式转换的构造函数。
这是因为m.text
是std::string
,它在运算符内部转换为TextMessage
,然后再次调用运算符。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 从CLR GUI实现非托管班级时,stackoverflow异常提出
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型