2014-12-06 4 views
0

(de) 직렬화를 공식화하기 위해 Serializable이라는 기본 클래스를 작성하려고합니다. 하지만 아래의 코드에 대해서는 매우 이상한 오류가 나타납니다 (라이브 실행 http://goo.gl/v92vmb). 나는 std = C++ 11 및 clang ++로 g ++ - 4.9를 시도했지만 더 이상 성공하지는 못했습니다.istream을 사용하여 deserialize 할 때 문제가 발생했습니다.

아무도 나에게 상황을 개선하는 방법과 어쩌면 저에게 말할 수 있습니까?

#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) 
+2

도움이 될지 확실하지 않지만 deserialization이 'const'라는 것이 이상하다는 것을 알게되었습니다. – lisyarus

+1

'deserialize()'는'const' 메소드로'Foo :: n'은'int const'입니다. – 0x499602D2

+0

오 이런. 그것은 그 문제를 해결했습니다. 오류 메시지 만 명확하면 ... – PureW

답변

2

좋아, @lisyarus 볼 같이 직렬화 방법을 선언 CONST. 이를 제거하면 문제가 해결됩니다. 오류 메시지 만 명확한 경우

관련 문제