2010-04-09 33 views
2

我一直在努力解決這個錯誤很長一段時間。 以下是我的代碼片段。使用boost序列化庫時出現編譯錯誤

//This is the header file 
    template<typename TElem> 
class ArrayList { 
public: 
    /** An accessible typedef for the elements in the array. */ 

    typedef TElem Elem; 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
    ar & ptr_; 
    ar & size_; 
    ar & cap_; 
    } 

    Elem *ptr_; // the stored or aliased array 
    index_t size_; // number of active objects 
    index_t cap_; // allocated size of the array; -1 if alias 
}; 

template <typename TElem> 
class gps_position 
{ 
public: 
    typedef TElem Elem; 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & degrees; 
     ar & minutes; 
     ar & seconds; 
    } 

private: 
    Elem degrees; 
    index_t minutes; 
    index_t seconds; 
}; 


// This is the .cc file 
#include <string> 
#include <fstream> 
#include <iostream> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/utility.hpp> 
#include <boost/serialization/serialization.hpp> 
#include "arraylist.h" 
int main() { 
    // create and open a character archive for output 
    std::ofstream ofs("filename"); 

    // create class instance 
// gps_position<int> g(35.65, 59, 24.567f); 
    gps_position<float> g; 
    // save data to archive 
    { 
     boost::archive::text_oarchive oa(ofs); 
     // write class instance to archive 
     //oa << g; 
     // archive and stream closed when destructors are called 
    } 

    // ... some time later restore the class instance to its orginal state 
/* gps_position<int> newg; 
    { 
     // create and open an archive for input 
     std::ifstream ifs("filename"); 
     boost::archive::text_iarchive ia(ifs); 
     // read class state from archive 
     ia >> newg; 
     // archive and stream closed when destructors are called 
    }*/ 
    ArrayList<float> a1; 
    ArrayList<int> a2; 

    a1.Init(22); 
    a2.Init(21); 

// a1.Resize(30); 
// a1.Resize(12); 
// a1.Resize(22); 
// a2.Resize(22); 
    a1[21] = 99.0; 
    a1[20] = 88.0; 

    for (index_t i = 0; i < a1.size(); i++) { 
    a1[i] = i; 
    a1[i]++; 
    } 

    std::ofstream s("test.txt"); 
    { 
    boost::archive::text_oarchive oa(s); 
    oa << a1; 

    } 
    return 0; 
} 

以下是我得到的編譯錯誤。

In file included from /usr/include/boost/serialization/split_member.hpp:23, 
       from /usr/include/boost/serialization/nvp.hpp:33, 
       from /usr/include/boost/serialization/serialization.hpp:17, 
       from /usr/include/boost/archive/detail/oserializer.hpp:61, 
       from /usr/include/boost/archive/detail/interface_oarchive.hpp:24, 
       from /usr/include/boost/archive/detail/common_oarchive.hpp:20, 
       from /usr/include/boost/archive/basic_text_oarchive.hpp:32, 
       from /usr/include/boost/archive/text_oarchive.hpp:31, 
       from demo.cc:4: 
/usr/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = float]’: 
/usr/include/boost/serialization/serialization.hpp:74: instantiated from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = float]’ 
/usr/include/boost/serialization/serialization.hpp:133: instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = float]’ 
/usr/include/boost/archive/detail/oserializer.hpp:140: instantiated from ‘void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive, T = float]’ 
demo.cc:105: instantiated from here 
/usr/include/boost/serialization/access.hpp:109: error: request for member ‘serialize’ in ‘t’, which is of non-class type ‘float’ 

請幫幫我。

回答

1

你不能序列化一個原始指針到一個浮點數,這就是你在這裏要做的。事實上,當你試圖序列化a1時,你實際上並不是實際序列化數組 - 你只是試圖將指針序列化到它的頭部。

我不知道你想要完成什麼,但是你可以製作a1和a2原始浮點數組嗎? Boost可以原生序列化這些。

float a1[21]; 
a1[21] = 99.0; 
for (index_t i = 0; i < 21; i++) { 
    a1[i] = i; 
    a1[i]++; 
} 

std::ofstream s("test.txt"); 
boost::archive::text_oarchive oa(s); 
oa << a1; 

更好的選擇可能是改變你的ArrayList定義中使用std::vector<Elem>,而不是原始Elem *。 Boost :: Serialization也已經知道如何序列化所有的STL容器。

欲瞭解更多信息,請參閱Boost serialization reference manual

相關問題