字符串流错误:无法访问类 'std::basic_ios<_Elem,_Traits>' 中声明的私有成员
Stringstream error: cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
在创建一个简单的异常类扩展时(在这里我可以更容易地构造错误消息),我已经将一个错误隔离为以下简单代码:
#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
),所以您必须提供您自己的复制函数。
相关文章:
- EASTL矢量<向量<int>>连续的
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- cv::D ataType<> 与 cv::traits::Type<>
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>