2013-08-21 63 views
4

我正在學習使用boost來對我的一些C++類進行系列化。Boost序列化給出了未定義的類型'boost :: STATIC_ASSERTION_FAILURE'

我在接口中有一個結構。我使用boost serilaize函數來像這樣序列化這個結構體。

Interface.h

struct X { 
    const Long rate; 
} 

template <class Archive>  
    void serialize(Archive& ar, uint32 version) 
    { 
    ar & this->rate; 
    } 
BOOST_CLASS_EXPORT(X); 

現在,這頭將我的主類中使用。讓說main.cpp中, 頭這個主類有

Main.h

#include "Interface.h" 
class Main { 
// some stuff 

template <class Archive> 
    void serialize(Archive& ar, uint32 version); 

    X x; 
    friend class boost::serialization::access; 
}; 

template <class Archive> 
void 
Main::serialize(Archive& ar, uint32 version) 
{ 
    ar & x; 
} 
BOOST_CLASS_EXPORT_KEY(Main); 

Main.cpp的

BOOST_CLASS_EXPORT_IMPLEMENT(Main); 

當我嘗試編譯此代碼我收到以下錯誤:

C:\ Users \ boost1470_win64_vc90sp1 \ include \ boost/archive/detail/check.hpp(162):error C2027:使用未定義的類型'boost :: STATIC_ASSERTION_FAILURE' [ X =假 ]

C:\用戶\ boost1470_win64_vc90sp1 \包括\升壓/存檔/細節/ iserializer.hpp(577):見參考起作用模板實例「無效的boost ::存檔::細節:: check_const_loading(無效) '被編譯 與 [ T =常量龍

C:\用戶\接口/ Interface.h(12):見參考起作用模板實例' 歸檔&升壓::歸檔:: detail :: interface_iarchive :: operator &(T &)'正在編譯 與 [ 存檔=升壓::歸檔:: text_iarchive, T =常量龍 ]

C:\用戶\接口/ Interface.h(17):見參考文獻類模板實例「升壓::歸檔::詳細:: extra_detail :: guid_initializer」正在編譯 與 [ T = X ]

任何想法什麼錯誤。我是新的提升和搞清楚這是如何工作的。

注:如果我在結構中使用int而不是long,我看不到boost :: STATIC_ASSERTION_FAILURE錯誤。

+5

'rate'是const。反序列化如何將其設置爲正確的值? –

+1

請不要用「throw」來描述C++編譯器錯誤,在C++中「throw」是指異常,而不是編譯器錯誤。 –

+0

這是通過嘗試序列化到需要命名值對的存檔產生的典型錯誤。試試這個代碼'ar&make_nvp(「rate」,this-> rate);'。文檔:http://www.boost.org/doc/libs/1_59_0/libs/serialization/doc/wrappers.html#nvp,但是儘管Alan的評論很可能是錯誤('const_cast' * might * 幫幫我)。 – alfC

回答

1

爲了澄清上述

struct X { 
    const Long rate; 
} 

評論的問題,一旦X被實例化,速率設置爲一個固定值,提升不能改變它。如果改爲

struct X { 
    Long rate; 
} 

您的代碼是否正常工作?