无法从字符串流接收信息

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&gt;&gt; 来自动将其放入流中。您需要提供该运算符,或调用某些方法,通常是to_string()。但是CPakcet::PacketType必须提供这个功能 我猜ss &gt;&gt; static_cast&lt;unsigned int&amp;&gt;(p); 我没有看到处理 PacketTypeoperator &gt;&gt; 重载。与错误消息非常吻合。 【参考方案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&lt;PacketType&gt;(s) 才能将其分配给somevalue @uneven_mark 编译器没有反对它,因为我将它定义为Packet::Type : unsigned int GCC、Clang 和 MSVC 在我的测试中存在分歧:godbolt.org/z/mnNFdS(添加 C++17 标志不会改变这一点。)

以上是关于无法从字符串流接收信息的主要内容,如果未能解决你的问题,请参考以下文章

从字符串流中删除(免费)元素

有可能以这种方式串流吗?从字符串转换为int?

C++学习50 对字符串流的读写

Java基础IO类之字符串流(查字符串中的单词数量)与管道流

C++ 字符串流

字符串流