2010-08-28 4 views
2

J'utilise la sérialisation boost sur Windows, et je voulais tester mon code sous linux (ubuntu) et malheureusement il ne compile pas.Problème de compilation de la sérialisation Boost

#include <string> 
#include <fstream> 

#include <boost/archive/xml_iarchive.hpp> 
#include <boost/archive/xml_oarchive.hpp> 


#include <boost/serialization/string.hpp> 
#include <boost/serialization/nvp.hpp> 
#include <boost/serialization/export.hpp> 


class MyClass 
{ 
    public: 
    int something; 
    MyClass(); 

    template<class archive> void serialize(archive& ar, const unsigned int version) 
    { 
     using boost::serialization::make_nvp; 
     ar & make_nvp("something", something); 
    } 


}; 



MyClass::MyClass() 
    : something(0) 
{ 
} 

int main(int argc, char ** argv) 
{ 
    std::cout << "Hello"; 
    MyClass obj(); 

    std::string path = "here.xml"; 

    std::ifstream ifs(path.c_str()); 
    if (ifs.good()) 
    { 
    boost::archive::xml_iarchive ia(ifs); 
    ia >> boost::serialization::make_nvp("obj", obj); 

    ifs.close(); 
    return true; 
    } 
    else 
    return false; 

} 

Voici ma ligne de compilation:

g++ test.cpp -lboost-serialization 

Et voici ce que je reçois:

In file included from /usr/include/boost/archive/detail/interface_iarchive.hpp:23, 
       from /usr/include/boost/archive/detail/common_iarchive.hpp:21, 
       from /usr/include/boost/archive/basic_xml_iarchive.hpp:23, 
       from /usr/include/boost/archive/xml_iarchive.hpp:24, 
       from test.cpp:6: 
/usr/include/boost/archive/detail/iserializer.hpp: In function ‘void boost::archive::load(Archive&, const T&) [with Archive = boost::archive::xml_iarchive, T = MyClass()]’: 
/usr/include/boost/archive/detail/common_iarchive.hpp:61: instantiated from ‘void boost::archive::detail::common_iarchive<Archive>::load_override(T&, int) [with T = MyClass(), Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/basic_xml_iarchive.hpp:81: instantiated from ‘void boost::archive::basic_xml_iarchive<Archive>::load_override(const boost::serialization::nvp<T>&, int) [with T = MyClass(), Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/xml_iarchive.hpp:75: instantiated from ‘void boost::archive::xml_iarchive_impl<Archive>::load_override(T&, int) [with T = const boost::serialization::nvp<MyClass()>, Archive = boost::archive::xml_iarchive]’ 
/usr/include/boost/archive/detail/interface_iarchive.hpp:61: instantiated from ‘Archive& boost::archive::detail::interface_iarchive<Archive>::operator>>(T&) [with T = const boost::serialization::nvp<MyClass()>, Archive = boost::archive::xml_iarchive]’ 
test.cpp:48: instantiated from here 
/usr/include/boost/archive/detail/iserializer.hpp:570: error: no matching function for call to ‘load_wrapper(boost::archive::xml_iarchive&, MyClass (&)(), boost::serialization::is_wrapper<MyClass()>)’ 

Je suis probablement manque un include ...

Répondre

4

Vous avez rencontré le Most Vexing Parse. Dans votre principale méthode, changer

MyClass obj(); 

à

MyClass obj; 

aussi, sur mon système Linux, la ligne de liaison est

g++ test.cpp -lboost_serialization 

Notez le trait de soulignement au lieu de tableau de bord, comme dans votre exemple

g++ test.cpp -lboost-serialization 
Questions connexes