2012-03-19 35 views
4

我從序列化的OpenCL的類型cl_long2這是這樣定義(自/usr/include/CL/cl_platform.hpp簡體):我定義的序列化聯盟類型:「靜態斷言失敗::而TYPEx ::值」

typedef int64_t cl_long; 
typedef union 
{ 
    cl_long __attribute__ ((aligned(16))) s[2]; 
    struct{ cl_long x, y; }; 
    struct{ cl_long s0, s1; }; 
    struct{ cl_long lo, hi; }; 
} cl_long2; 

以下獨立序列化功能:

namespace boost{ namespace serialization { 
template<class Archive> void serialize(Archive &ar, cl_long2 &i, const unsigned version){ 
    ar & make_nvp("x",i.x); 
    ar & make_nvp("y",i.y); 
} 

}}; 

當我編譯我的代碼,它調用cl_long2的系列化從作爲一個類的成員,我收到以下錯誤,我無法理解(錯誤是相同的,如果它不是std::vector<cl_long2>,只是一個獨立的變量):無論存檔類型是XML或二進制

/usr/include/boost/archive/detail/check.hpp: In function ‘void boost::archive::detail::check_object_level() [with T = cl_long2]’: 
/usr/include/boost/archive/detail/iserializer.hpp:438:9: instantiated from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = cl_long2, Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/detail/iserializer.hpp:592:5: instantiated from ‘void boost::archive::load(Archive&, T&) [with Archive = boost::archive::xml_iarchive, T = cl_long2]’ 
/usr/include/boost/archive/detail/common_iarchive.hpp:66:9: instantiated from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = cl_long2, Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/basic_xml_iarchive.hpp:86:9: instantiated from ‘void boost::archive::basic_xml_iarchive<Archive>::load_override(const boost::serialization::nvp<T>&, int) [with T = cl_long2, Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/xml_iarchive.hpp:93:9: instantiated from ‘void boost::archive::xml_iarchive_impl<Archive>::load_override(T&, int) [with T = const boost::serialization::nvp<cl_long2>, Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/detail/interface_iarchive.hpp:60:9: [ skipping 5 instantiation contexts ] 
/usr/include/boost/serialization/split_free.hpp:58:9: instantiated from ‘static void boost::serialization::free_loader<Archive, T>::invoke(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive, T = std::vector<cl_long2>]’ 
/usr/include/boost/serialization/split_free.hpp:74:5: instantiated from ‘void boost::serialization::split_free(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive, T = std::vector<cl_long2>]’ 
/usr/include/boost/serialization/vector.hpp:151:5: instantiated from ‘void boost::serialization::serialize(Archive&, std::vector<U, Allocator>&, unsigned int) [with Archive = boost::archive::xml_iarchive, U = cl_long2, Allocator = std::allocator<cl_long2>]’ 
/usr/include/boost/serialization/serialization.hpp:128:9: instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::xml_iarchive, T = std::vector<cl_long2>]’ 
/usr/include/boost/archive/detail/iserializer.hpp:188:5: instantiated from ‘void boost::archive::detail::iserializer<Archive, T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) const [with Archive = boost::archive::xml_iarchive, T = std::vector<cl_long2>]’ 
myFile.cpp:368:2: instantiated from here 
/usr/include/boost/archive/detail/check.hpp:60:5: error: static assertion failed: "typex::value" 

出現同樣的錯誤。我正在使用boost :: serialization 1.46。

任何提示?

**編輯:較小的例子包括錯誤是在http://ideone.com/4UgCn

+0

通過任何機會,是「BOOST_NO_INTRINSIC_INT64_T」定義? – LucasB 2012-03-20 09:57:22

+0

不,它不是(我通過boost頭文件,而且它也不存在)。 'int64_t'是一個系統定義的類型(帶有gcc工具鏈的Linux)。 – eudoxos 2012-03-20 10:02:47

+0

看着斷言行,它說「陷阱試圖序列化標記爲not_serializable的對象」。您應該查看http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/traits.html,尤其是出於某種原因爲您的數據類型設置的「not_serializable」屬性。 – LucasB 2012-03-20 10:28:04

回答

6

如果你看看那裏的斷言失敗行(detail/check.hpp:60),也正上方評論:

// trap attempts to serialize objects marked 
// not_serializable 
BOOST_STATIC_ASSERT(typex::value); 

documentation of this 'not_serializable' trait表示您必須先啓用此long2類型。正如你發現的,這是通過完成:

BOOST_CLASS_IMPLEMENTATION(long2,boost::serialization::object_serializable)