无法从字符串流接收信息
Posted
技术标签:
【中文标题】无法从字符串流接收信息【英文标题】:Can't receive info from string stream 【发布时间】:2019-11-26 00:09:49 【问题描述】:所以我尝试使用std::stringstream
将信息序列化为字符串,但编译器不喜欢我。
enum PacketType : unsigned int
PacketType_unknown = 0,
PacketType_ping,
PacketType_server_welcome,
PacketType_client_greetings,
;
std::stringstream ss;
unsigned int v;
PacketType p;
ss << (unsigned int)somevalue;
// error here
ss >> p;
错误是:
no match for 'operator>>' (operand types are 'std::stringstream' aka
'std::__cxx11::basic_stringstream<char>' and 'PacketType')GCC
编辑:忘了添加这么多东西,因为我认为这不重要
【问题讨论】:
请粘贴您遇到的错误 @borievka 哎呀忘了 您没有提供完整的代码。但是由于错误,我们知道somevalue
的类型为CPacket::PacketType
,并且您没有提供重载的operator>>
来自动将其放入流中。您需要提供该运算符,或调用某些方法,通常是to_string()
。但是CPakcet::PacketType
必须提供这个功能
我猜ss >> static_cast<unsigned int&>(p);
我没有看到处理 PacketType
的 operator >>
重载。与错误消息非常吻合。
【参考方案1】:
我终于弄明白了,我的代码不工作的原因是因为......
PacketType
!= unsigned int
。
PacketType 是它自己的类型。即使它基于unsigned int
。
所以我要做的就是
unsigned int s;
ss >> s;
somevalue = static_cast<PacketType>(s);
虽然还是很奇怪...
PacketType
不应该继承 unsigned int
。
【讨论】:
不,尽管语法与类相似,但枚举不会“继承”unsigned int
并且不能隐式转换为 1。确实,这就是作用域枚举的全部意义。只需将其发送给unsigned int
你自己...
有时我很高兴我在评论之前检查了新的 cmets。为我节省了一些在那里打字的时间。发表此评论让我完全燃烧。
该代码不应该工作,您需要明确static_cast<PacketType>(s)
才能将其分配给somevalue
。
@uneven_mark 编译器没有反对它,因为我将它定义为Packet::Type : unsigned int
GCC、Clang 和 MSVC 在我的测试中存在分歧:godbolt.org/z/mnNFdS(添加 C++17 标志不会改变这一点。)以上是关于无法从字符串流接收信息的主要内容,如果未能解决你的问题,请参考以下文章