提升序列化 - 导出多个CPP文件

时间:2015-09-07 16:21:45

标签: c++ serialization boost macros

最后几天我遇到了Boost Serialization问题:

我正在尝试在多个文件中序列化和反序列化多个派生的类。为了保持通用性,我创建了模板函数,如:

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文件中,并且在标题中使用宏我会感到烦恼&#34; duplicate init_guid&#34;错误。

即使我选择不使用模板方法,我仍然会因为我在不同文件中有不同的序列化方法并因此导出多次而导致这些错误。

有没有人知道如何使用模板方法,或者如何在多个CPP文件中导出类?

我已尝试将BOOST_CLASS_EXPORT拆分为BOOST_CLASS_EXPORT_KEYBOOST_CLASS_EXPORT_IMPLEMENT,但仍导致同样的错误。另外,当只有特定类的Header文件时,我真的不知道放置BOOST_CLASS_EXPORT_IMPLEMENT宏的位置。

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。

分成BOOST_CLASS_EXPORT_KEYBOOST_CLASS_EXPORT_IMPLEMENT确实是解决方案的关键。

与所有带外部链接的C ++符号一样,

  • 可以将声明放在某个共享位置(如头文件)
  • 必须将 definitions 放在单个转换单元中,以便只有一个链接器输入包含定义。

在这种情况下,只需在最多一个(静态)链接的翻译单元中包含BOOST_CLASS_EXPORT_IMPLEMENT(想想:cpp文件)。

参见背景信息: