2014-10-28 50 views
1

所以我试图序列化我的类最近使用boost :: serialization,并阅读本教程:http://en.highscore.de/cpp/boost/serialization.html。 我可以编译这个页面的代码,但我不能编译我自己编写的代码。例如在部分“类层次的序列化对象”我们有这样的代码:升压序列化错误C4308:负积分常数转换为无符号类型

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 
#include <iostream> 
#include <sstream> 
#include <string> 

std::stringstream ss; 

class person 
{ 
public: 
    person() 
    { 
    } 

    person(int age) 
    : age_(age) 
    { 
    } 

    int age() const 
    { 
    return age_; 
    } 

private: 
    friend class boost::serialization::access; 

    template <typename Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
    ar & age_; 
    } 

    int age_; 
}; 

class developer 
    : public person 
{ 
public: 
    developer() 
    { 
    } 

    developer(int age, const std::string &language) 
    : person(age), language_(language) 
    { 
    } 

    std::string language() const 
    { 
    return language_; 
    } 

private: 
    friend class boost::serialization::access; 

    template <typename Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
    ar & boost::serialization::base_object<person>(*this); 
    ar & language_; 
    } 

    std::string language_; 
}; 

void save() 
{ 
    boost::archive::text_oarchive oa(ss); 
    developer d(31, "C++"); 
    oa << d; 
} 

void load() 
{ 
    boost::archive::text_iarchive ia(ss); 
    developer d; 
    ia >> d; 
    std::cout << d.age() << std::endl; 
    std::cout << d.language() << std::endl; 
} 

int main() 
{ 
    save(); 
    load(); 
} 

,它工作正常,但可以说,我写了这个代码:

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
#include <iostream> 
#include <fstream> 
#include <boost/serialization/string.hpp> 
#include <string> 

class A 
{ 
    friend class boost::serialization::access; 
public: 
    std::string a; 
private: 
    template<class Archive> 
    void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & a; 
    } 
}; 

class B : public A 
{ 
    friend class boost::serialization::access; 
public: 
    std::string b; 
private: 
    template<class Archive> 
    void serialize(Archive& archive, const unsigned int version) 
    { 
     archive & boost::serialization::base_object<A>(*this); 
     archive & b; 
    } 
}; 

BOOST_CLASS_EXPORT(B) 

void save() 
{ 
    std::ofstream file("archive.xml"); 
    boost::archive::xml_oarchive oa(file); 
    B *myB = new B(); 
    myB->a = "1"; 
    myB->a = "2"; 

    oa << myB; 
    delete myB; 
    file.close(); 
} 

void load() 
{ 
    std::ifstream file("archive.xml"); 
    boost::archive::xml_iarchive ia(file); 
    A *myB; 

    ia >> myB; 
    std::cout << myB->a << std::endl; 
} 

int main() 
{ 
    save(); 
    load(); 
    std::cin.get(); 
} 

当我编译此,我得到这个错误:

error C4308: negative integral constant converted to unsigned type c:\program files\boost_1_55_0\boost\mpl\print.hpp 

你能告诉我我做错了什么吗?

+0

今天我才知道:如果MSVC给人以'错误C4308 '顶级错误,这可能意味着'BOOST_STATIC_WARNING'在模板实例化中被触发。 – sehe 2014-10-28 19:32:27

回答

0

miffed由编译错误(目前也没有MSVC方便的尝试)。

在一天结束时,我能够使用MSVC2013进行测试。完整的错误(警告)读取:

boost_1_55_0\boost\mpl\print.hpp(51): warning C4308: negative integral constant converted to unsigned type 
      boost_1_55_0\boost\serialization\static_warning.hpp(92) : see reference to class template instantiation 'boost::mpl::print<boost::serialization::BOOST_SERIALIZATION_STATIC_WARNING_LINE<137>>' being compiled 
      boost_1_55_0\boost\serialization\export.hpp(137) : see reference to class template instantiation 'boost::serialization::static_warning_test<false,137>' being compiled 
      boost_1_55_0\boost\serialization\export.hpp(136) : while compiling class template member function 'const boost::archive::detail::extra_detail::guid_initializer<B> &boost::archive::detail::extra_detail::guid_initializer<B>::export_guid(void) const' 
      so.cpp(40) : see reference to function template instantiation 'const boost::archive::detail::extra_detail::guid_initializer<B> &boost::archive::detail::extra_detail::guid_initializer<B>::export_guid(void) const' being compiled 
      so\so.cpp(40) : see reference to class template instantiation 'boost::archive::detail::extra_detail::guid_initializer<B>' being compiled 

export.hpp行写着:

BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value); 

你去那里,你想通过poitner - 底部的序列化多态类,和除非RTTI可用,否则这是没有意义的。为了这一点,这个班级至少需要1个虚拟方法。


固定了样品所以它的工作原理:

我注意到缺乏NVP包装的。这里有一个编译版本:你需要(以及)Live On Coliru

#include <boost/archive/xml_oarchive.hpp> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
#include <iostream> 
#include <fstream> 
#include <boost/serialization/string.hpp> 
#include <string> 

class A { 
    friend class boost::serialization::access; 

    public: 
    std::string a; 
    virtual ~A() {} 

    private: 
    template <class Archive> 
    void serialize(Archive &archive, const unsigned int version) 
    { 
     archive &BOOST_SERIALIZATION_NVP(a); 
    } 
}; 

class B : public A { 
    friend class boost::serialization::access; 

    public: 
    std::string b; 

    private: 
    template <class Archive> 
    void serialize(Archive &archive, const unsigned int version) 
    { 
     using namespace boost::serialization; 
     archive &make_nvp("base", base_object<A>(*this)); 
     archive &BOOST_SERIALIZATION_NVP(b); 
    } 
}; 

BOOST_CLASS_EXPORT(B) 

void save() 
{ 
    std::ofstream file("archive.xml", std::ios::binary); 
    boost::archive::xml_oarchive oa(file); 
    B *myB = new B(); 
    myB->a = "1"; 
    myB->b = "2"; 

    A* myA = myB; 
    oa << boost::serialization::make_nvp("myA", myA); 
    delete myB; 
    file.close(); 
} 

void load() 
{ 
    std::ifstream file("archive.xml", std::ios::binary); 
    boost::archive::xml_iarchive ia(file); 
    A *myA; 

    ia >> boost::serialization::make_nvp("myA", myA); 

    std::cout << "a: " << myA->a << std::endl; 
    if (B* myB = dynamic_cast<B*>(myA)) 
     std::cout << "b: " << myB->b << std::endl; 
} 

int main() 
{ 
    save(); 
    load(); 
} 

注意序列化类型相同(A*)如你反序列化。

通过使A虚拟类,你可以使用一个运行时投:

std::cout << "a: " << myA->a << std::endl; 
    if (B* myB = dynamic_cast<B*>(myA)) 
     std::cout << "b: " << myB->b << std::endl; 

为了完整起见,这里的相应archive.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!DOCTYPE boost_serialization> 
<boost_serialization signature="serialization::archive" version="10"> 
<myA class_id="1" class_name="B" tracking_level="1" version="0" object_id="_0"> 
    <base class_id="0" tracking_level="1" version="0" object_id="_1"> 
     <a>1</a> 
    </base> 
    <b>2</b> 
</myA> 
+0

哇,这工作!但是我很难理解这一点,做这项工作有什么不同,但不是我写的那个。是因为制作nvp还是虚拟课堂?为什么编译器无法编译我写的代码? – Sinapse 2014-10-28 11:18:21

+0

由于XML需要序列化节点的元素名称(请参阅** [docs for“Wrappers”](http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/wrappers.html#nvp) **)。另外,在序列化一个'B *'但试图反序列化为'A *'时(虽然这不是编译时问题),但是存在不一致的地方 – sehe 2014-10-28 11:28:52

+0

似乎是因为虚拟类,如果我评论虚拟解构器并使用static_cast而不是dynamic_cast,错误再次出现!那么,我的所有课程都应该是虚拟的吗?为什么??这不荒唐吗? – Sinapse 2014-10-28 11:30:47

相关问题