字符串流错误:无法访问类 'std::basic_ios<_Elem,_Traits>' 中声明的私有成员

Stringstream error: cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

本文关键字:gt Traits 成员 声明 Elem basic 错误 访问 ios 字符串 std      更新时间:2023-10-16

在创建一个简单的异常类扩展时(在这里我可以更容易地构造错误消息),我已经将一个错误隔离为以下简单代码:

#include <sstream>
#include <string>
class myCout {
public:
    std::stringstream ssOut;    // Removing this gets rid of error
    template <typename T> myCout& operator << (const T &x) {
        // Do some formatting
        return *this;
    }
};
class myErr : public myCout {
public:
    using myCout::operator<<;
};
int main(int argc, const char* argv[]) {
    throw myErr() << "ErrorMsg" << 1;
    myCout() << "Message Will Be Formatted";
    return 0;
}

在编译时产生以下错误:

1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludesstream(724): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_stringstream<_Elem,_Traits,_Alloc>::basic_stringstream(const std::basic_stringstream<_Elem,_Traits,_Alloc> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]

(实际上它更复杂,扩展了std::runtime_error)

我看过以前的答案,说问题是由于没有通过引用传递流引起的,但我看不出我为什么不是。

注释掉std::stringstream ssOut修复了这个问题。为什么,以及如何解决潜在的问题?

按值抛出异常,这确实是推荐的做法。然而,这意味着异常作为throw语句的一部分被复制,所以它必须有一个可访问的复制构造函数。因为您有一个不可复制的成员(std::stringstream),所以您必须提供您自己的复制函数。