注意:
Boost 的归档方案基于对称的输入和输出归档类。一直写这两个都很乏味,所以我会用和?archive
来表示。oarchive
iarchive
摘要:
在将我的自定义存档的基类从 更改为 之后binary_?archive_impl
,当编译器实例化我的其他类中text_?archive_impl
的方法时,我的自定义存档类不再“找到” 。serialize(...)
背景:
我的应用程序使用 的子类成功地读取和写入文件到磁盘binary_?archive_impl
(文档和/或代码注释建议这样做而不是从 派生binary_?archive
)。我需要从二进制文件格式切换到文本格式,因此我将自定义存档的基类切换为text_?archive_impl
. 就在那时,一切都爆发了。
问题:
我的自定义归档类添加了功能,包括一些在其 Boost 基类中不存在的附加方法;这些方法serialize(...)
在我的许多课程的方法中被调用,并且它们工作正常。将基类从 更改为 后binary_?archive_impl
,text_?archive_impl
我到处都收到编译错误,抱怨我的自定义方法在text_?archive
. 嗯,这很明显(!!!),但它们确实存在于我的自定义档案中,当我使用 Boost 的二进制基类时它们工作得很好。这是怎么回事?
我发现了什么,以及我暂时的 - 但不受欢迎的 - 解决方案:
在扯掉我的头发并绕着圈子转了大约一天后,这就是我发现的......
1) 前段时间(我相信是 Boost 1.34),文件“binary_?archive.hpp”被分成“binary_?archive_impl.hpp”和“binary_?archive.hpp”(后者#include 前者)。这不是对“text_?archive.hpp”进行的。(因此,我将应用程序的#include 行从“binary_?archive_impl.hpp”更改为简单的“text_?archive.hpp”。)
2)如果我将“text_?archive.hpp”分成两部分并且#include 仅“..._impl.hpp”标题,一切正常。(但我真的不想修改我的 Boost 安装!)
3)更仔细地查看这些标题并摆弄了一下,我发现如果我使用原始的、未修改的标题并注释掉该行
BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
(同样适用于text_iarchive
),然后一切正常。(顺便说一句,我自己的存档代码中有类似的行来“注册”我的自定义存档。)
谜团和我的困境:
A)为什么这些线条的存在会破坏作品?...为什么删除它们会使事情起作用?...我这样做可能会破坏(不知道)什么?
B) 为什么“text_?archive.hpp”文件很久以前没有与“binary_?archive.hpp”文件一起拆分?(图书馆坏了吗?应该修好吗?)
C) 有没有办法在我的应用程序代码中解决这个问题而不修改我的 Boost 安装?
PS 我正在使用 Boost 1.48 和 Visual Studio 2010(64 位)
PPS 我想以上所有内容都同样适用于text_w?archive