C++ C++;Stringstream-使用rd_buf更改常量对象进行复制

C++ C++;Stringstream-使用rd_buf更改常量对象进行复制,c++,stream,constants,stringstream,C++,Stream,Constants,Stringstream,给定一个stringstream对象,我想将其复制到另一个。根据: (除其他外),正确的方法是使用rdbuf()成员。然而,这似乎会引起问题,特别是当stringstream是const时 例如: void DoSomething(stringstream & ss) { stringstream sstmp; cout << "pos 1: " << ss.tellg() << "\n"; sstmp << s

给定一个stringstream对象,我想将其复制到另一个。根据:

(除其他外),正确的方法是使用
rdbuf()
成员。然而,这似乎会引起问题,特别是当stringstream是const时

例如:

void DoSomething(stringstream & ss)
{
    stringstream sstmp;

    cout << "pos 1: " << ss.tellg() << "\n";
    sstmp << ss.rdbuf();
    cout << "pos 2: " << ss.tellg() << "\n";
//        sstmp.rdbuf()->pubseekpos(0, ios_base::in | ios_base::out);

    cout << "String: " << sstmp.str() << "\n";
}

int main(void)
{
    stringstream ss;
    ss << "Hello";

    DoSomething(ss);
    DoSomething(ss);

    return 0;
}
DoSomething()
的第一次调用更改了内部指针,即使
stringstream
是const(此处省略,因为偶数
tellg()
不是const)。解决这一问题的方法是使用
seekg()
,但不能在常量流上调用它。我尝试了另一种方法(在代码中注释掉),但没有成功

那么,可以对以下两种情况做些什么:

  • 复制(const)
    stringstream
    ,而不进行实际更改,或

  • 重置常量对象上的位置


  • 注意:在ArchLinux上使用GCC4.8.1编译,最简单的方法是只制作字符串并以这种方式复制:
    sstmp.str(ss.str())

    不太明显的方法是充分利用这样一个事实,即您可以从const stringstream获得对
    rdbuf
    的非常量访问

    我做了一些更改,以便编译您的代码,并更新代码以直接设置
    rdbuf
    的位置,但它应该做您想要的,现在输出:

    String: Hello
    String: Hello
    
    -

    #包括
    #包括
    无效剂量测定(常数标准::stringstream和ss)
    {
    std::stringstream sstmp;
    sstmp pubseekpos(0,标准::ios_基::in);
    
    std::cout丢失
    tellg()
    调用并添加对
    ss.rdbuf()->pubseekoff的调用(0,std::ios_base::beg,std::ios_base::in);
    可能会得到你想要的,但我不确定这会让我明白什么是真正的问题;为什么。必须有对流库有更深入了解的人介入。问题很好,而且+1做了预期答案的初始作业。是的,我现在看到了我的打字错误。我很接近:)谢谢你的确认
    String: Hello
    String: Hello
    
    #include <sstream>
    #include <iostream>
    
    void DoSomething(const std::stringstream& ss)
    {
        std::stringstream sstmp;
    
        sstmp << ss.rdbuf();
        ss.rdbuf()->pubseekpos(0, std::ios_base::in);
    
        std::cout << "String: " << sstmp.str() << "\n";
    }
    
    int main()
    {
        std::stringstream ss;
        ss << "Hello";
    
        DoSomething(ss);
        DoSomething(ss);
    
        return 0;
    }