代码之家  ›  专栏  ›  技术社区  ›  0x26res

Boost序列化编译问题

  •  2
  • 0x26res  · 技术社区  · 14 年前

    我正在Windows上使用Boost序列化,我想在Linux(Ubuntu)上测试我的代码,但不幸的是它没有编译。

    #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;
    
    }
    

    这是我的编译行:

    g++ test.cpp -lboost-serialization
    

    我得到的是:

    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()>)’
    

    我可能缺少一个包含…

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

    你遇到了 Most Vexing Parse . 在你的主要方法中,改变

    MyClass obj();
    

    MyClass obj;
    

    另外,在我的Linux系统上,链接线是

    g++ test.cpp -lboost_serialization
    

    注意下划线而不是破折号,就像在示例中一样

    g++ test.cpp -lboost-serialization