Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当覆盖<&书信电报;(流)操作符,调试进入std';s<&书信电报;而不是impl?_C++_Streaming_Overriding_Iostream - Fatal编程技术网

C++ 当覆盖<&书信电报;(流)操作符,调试进入std';s<&书信电报;而不是impl?

C++ 当覆盖<&书信电报;(流)操作符,调试进入std';s<&书信电报;而不是impl?,c++,streaming,overriding,iostream,C++,Streaming,Overriding,Iostream,这个问题已经得到部分回答:解决方案是在我的类的一个字段中,特别是_escape,有UB。但是,仍然不知道为什么Visual Studio的堆栈跟踪没有显示操作符,我认为首先要做的是修复从\u escape读取的未定义行为,该行为是在销毁了指向它的临时字符串之后发生的。我认为最好的选择是替换const char*\u escape;国际埃斯克伦带有std::字符串转义

这个问题已经得到部分回答:解决方案是在我的类的一个字段中,特别是_escape,有UB。但是,仍然不知道为什么Visual Studio的堆栈跟踪没有显示操作符,我认为首先要做的是修复从
\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];
        }
    }
};