C++ 当覆盖<&书信电报;(流)操作符,调试进入std';s<&书信电报;而不是impl?
这个问题已经得到部分回答:解决方案是在我的类的一个字段中,特别是_escape,有UB。但是,仍然不知道为什么Visual Studio的堆栈跟踪没有显示操作符,我认为首先要做的是修复从C++ 当覆盖<&书信电报;(流)操作符,调试进入std';s<&书信电报;而不是impl?,c++,streaming,overriding,iostream,C++,Streaming,Overriding,Iostream,这个问题已经得到部分回答:解决方案是在我的类的一个字段中,特别是_escape,有UB。但是,仍然不知道为什么Visual Studio的堆栈跟踪没有显示操作符,我认为首先要做的是修复从\u escape读取的未定义行为,该行为是在销毁了指向它的临时字符串之后发生的。我认为最好的选择是替换const char*\u escape;国际埃斯克伦带有std::字符串转义
\u escape
读取的未定义行为,该行为是在销毁了指向它的临时字符串之后发生的。我认为最好的选择是替换const char*\u escape;国际埃斯克伦代码>带有std::字符串转义如果调用了print()
,那么您的for循环就变成了os,那么您被重写的操作符看起来就像您的类有一个cast操作符一样,它被调用以将转义符
转换为字符常量*
。最有可能的情况是您的operaro@ArchbishopOfBanterbury我也这么认为,但我在操作符重载的每一行上都设置了断点,它从未介入。MCVE应该是完整的且可验证的。我们不能为自己编译此文件并看到错误。在添加EscapeStr
的整个定义之前,它的大部分可能不会影响这种行为,并且可以删除(在MCVE最小的精神下)。FWIW,你的Ideone示例。啊-你是对的。我忽略了那个错误,因为我太专注于获取操作符
ostream& operator<<(ostream& os, const MyObject& dt)
std::ostream& operator <<(std::ostream& os, const EscapeStr& t)
{
t.print(os);
return os;
}
void print(std::ostream& os) const {
for (int i = 0; i < _elem.length(); i++) {
char c = _elem[i];
if (_delim[c]) {
for (int j = 0; j < _escLen; j++) {
os << _escape[j];
}
}
os << _elem[i];
}
}
template<class _Traits> inline
basic_ostream<char, _Traits>& operator<<(
basic_ostream<char, _Traits>& _Ostr,
const char *_Val); // insert NTBS into char stream
/// ostream operator for indent
std::ostream& operator <<(std::ostream &os, indent x)
{
static const std::string spaces(" ");
while(x.d--) {
os << spaces;
}
return os;
}
const static char _delims[] = { '\\', '"' };
const static std::vector<char> delims(_delims, _delims + 2);
class EscapeStr {
const static unsigned short MAX_CHAR = 256;
std::string &_elem;
bool _delim[MAX_CHAR];
const char* _escape;
int _escLen;
public:
EscapeStr(std::string &elem,
const std::vector<char> &delim = std::vector<char>(1, '"'),
const std::string &escape = "\\") :
_elem(elem),
_escape(escape.c_str()),
_escLen(escape.size())
{
for (int i = 0; i < MAX_CHAR; i++) {
_delim[i] = false;
}
for (int i = 0; i < delim.size(); i++) {
_delim[delim[i]] = true;
}
}
void print(std::ostream& os) const {
for (int i = 0; i < _elem.length(); i++) {
char c = _elem[i];
if (_delim[c]) {
for (int j = 0; j < _escLen; j++) {
os << _escape[j];
}
}
os << _elem[i];
}
}
};