最近几天我一直在为 Boost 序列化问题而苦苦挣扎:
我正在尝试序列化和反序列化多个文件中的多个派生 类。为了保持通用性,我创建了模板函数,例如:
template<typename T>
void
Helper::SaveToFile(T* data, std::string file)
{
std::ofstream ofs(file.c_str());
boost::archive::text_oarchive oa(ofs);
oa << data;
}
为了派生类的序列化工作,我需要使用 Boost 宏 BOOST_CLASS_EXPORT
。但是,我无法将此模板方法放在 CPP 文件中,并且在 header 中使用宏时,我得到了这些恼人的“duplicate init_guid
”错误。
即使我选择不使用模板方法,我仍然会遇到这些错误,因为我在不同的文件中使用了不同的序列化方法,因此导出了多次。
有没有人对如何使用模板方法或如何在多个 CPP 文件中导出类有任何提示?
我已经尝试将 BOOST_CLASS_EXPORT
拆分为 BOOST_CLASS_EXPORT_KEY
和 BOOST_CLASS_EXPORT_IMPLEMENT
,仍然导致相同的错误。此外,当只有特定类的头文件时,我真的不知道将 BOOST_CLASS_EXPORT_IMPLEMENT
宏放在哪里。
最佳答案
你走在正确的轨道上。
拆分为BOOST_CLASS_EXPORT_KEY
和BOOST_CLASS_EXPORT_IMPLEMENT
确实是解决方案的关键。
与所有带有外部链接的 C++ 符号一样,您
- 可以将声明放在一些共享位置(比如头文件)
- 必须将定义放在单个翻译单元中,以便只有一个链接器输入包含定义。
在这种情况下,只需将 BOOST_CLASS_EXPORT_IMPLEMENT
包含在最多一个(静态)链接的翻译单元(想想:cpp 文件)中。
查看背景:
关于c++ - Boost Serialization - 导出多个 CPP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32442778/