使用 istream >> 反序列化时出现问题

Trouble when deserializing with istream >>

本文关键字:gt 问题 使用 反序列化 istream      更新时间:2023-10-16

我正在尝试制作一个名为Serializable的基类,以形式化一些(反)序列化。但是下面的代码出现了非常神秘的错误(在 http://goo.gl/v92vmb 实时运行)。我用 std=c++11 和 clang++ 尝试了 g++-4.9,但没有更多的成功。

谁能告诉我出了什么问题,也许如何改善这种情况?

#include <iostream>
#include <sstream>
/** Classes inheriting this class must implement the serialize-function...*/
class Serializable {
  public:
    virtual void serialize(std::ostream& os) const = 0;
    virtual void deserialize(std::istream& is) const = 0;
};
std::ostream& operator<< (std::ostream& os, const Serializable& s) {
    s.serialize(os);
    return os;
}
std::istream& operator>> (std::istream& is, const Serializable& s) {
    s.deserialize(is);
    return is;
}
class Foo : public Serializable {
  public:
    int N;
    void serialize(std::ostream& os) const override;
    void deserialize(std::istream& is) const override;
};
void Foo::serialize(std::ostream& os) const {
    os << N;
}
void Foo::deserialize(std::istream& is) const {
    is >> N;
    std::cout << "Got " << N << std::endl;
}
int main()
{
    std::stringstream ss;
    ss << "9";
    Foo f;
    f.deserialize(ss);
    return 0;
}

错误:

In member function 'virtual void Foo::deserialize(std::istream&) 
const':                                                                    
main.cpp:32:11: error: cannot bind 'std::istream {aka std::basic_istream<ch
ar>}' lvalue to 'std::basic_istream<char>&&'                               
     is >> N;                                                              
           ^                                                               
In file included from /usr/include/c++/4.8.3/iostream:40:0,                
                 from main.cpp:1:                                          
/usr/include/c++/4.8.3/istream:872:5: error:   initializing argument 1 of '
std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_Ch
arT, _Traits>&&, _Tp&) [with _CharT = char; _Traits = std::char_traits<char
>; _Tp = const int]'                                                       
     operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x) 

好的,如@lisyarus所见,反序列化方法被声明为 const。 删除解决了问题。如果错误消息更清晰就好了。