0
我正在嘗試使一個名爲Serializable的基類正式化一些(de)序列化。但是,對於下面的代碼,我得到了非常神祕的錯誤(在http://goo.gl/v92vmb上運行)。我用std = C++ 11和clang ++試過g ++ - 4.9,但沒有更多的成功。使用istream進行反序列化時出現問題>>
誰能告訴我什麼是錯的,也許如何改善這種情況?
#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)
不知道是否有幫助,但我覺得反序列化是'const'奇怪。 – lisyarus 2014-12-06 23:53:41
'deserialize()'是一個'const'方法,這意味着'Foo :: n'是'int const'。 – 0x499602D2 2014-12-07 00:01:47
哦,不錯。這解決了問題。如果只有錯誤消息更清晰...... – PureW 2014-12-07 00:03:01