boost序列化错误C4308:负整数常量转换为无符号类型
boost serialization error C4308: negative integral constant converted to unsigned type
所以我最近尝试使用boost::序列化来序列化我的类,并且正在阅读本教程:http://en.highscore.de/cpp/boost/serialization.html.我可以编译这个页面中的代码,但我不能编译我自己写的代码。例如,在"类层次结构对象的序列化"一节中,我们有以下代码:
#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 filesboost_1_55_0boostmplprint.hpp
你能告诉我我做错了什么吗?
被编译错误激怒了(目前也没有MSVC可供尝试)
当天结束时,我能够使用MSVC2013进行测试。完整错误(警告)显示:
boost_1_55_0boostmplprint.hpp(51): warning C4308: negative integral constant converted to unsigned type
boost_1_55_0boostserializationstatic_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_0boostserializationexport.hpp(137) : see reference to class template instantiation 'boost::serialization::static_warning_test<false,137>' being compiled
boost_1_55_0boostserializationexport.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
soso.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将多态类序列化到base,除非RTTI可用,否则这是没有意义的。为了实现这一点,类至少需要一个虚拟方法。
修复样品使其工作:
我注意到缺少NVP包装。这是一个编译版本:LiveOnColiru
#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>
相关文章:
- 是否应避免从非常量迭代器转换为常量迭代器?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 为什么我收到"从常量指针到指针的转换无效?
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 在编译时将常量字符* 转换为常量 char_type*
- 为什么下面带有非常量转换函数的代码没有歧义?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 字符串强制转换为常量字符*
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 将错误作为从字符串常量到"char*"的已弃用转换 [-Wwrite-strings]
- 将编译时常量向量转换为堆分配版本
- 在<uint8_t> <char> c++ 中将常量向量转换为常量向量
- 在不同类型之间转换常量指针
- 转换(常量字符*)变量出错
- C++大小写中的类型转换常量字符串
- 转换常量无符号字符无效
- 转换常量表达式定义的说明
- c++ 11强制转换常量迭代器,指向shared_ptr对象的容器
- 条件运算符+上转换+常量引用
- c++限定转换-常量和模板