Примечание:
Схема архивирования 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" (последний # включил первый). Это не было сделано для "text_? Archive.hpp". (В результате я изменил свое приложение #include lines из "binary_? Archive_impl.hpp" на просто "text_? Archive.hpp".)
2) Если я разделил "text_? archive.hpp" на две части и # включил только заголовки "..._ impl.hpp", все работает. (Но я действительно не хочу изменять мою установку Boost!)
3) Более внимательно посмотрев на эти заголовки и немного поиграв, я обнаружил, что если использовать оригинальные, немодифицированные заголовки и прокомментировать строку
BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
(а также для text_iarchive
), тогда все снова работает отлично. (Кстати, у меня есть аналогичные строки в моем собственном архиве, чтобы "зарегистрировать" мои пользовательские архивы.)
Тайна и моя дилемма:
A) Почему присутствие этих линий нарушает работу?... и почему их удаление заставляет работать?... и что я мог сломать (не зная об этом)?
B) Почему файлы "text_? archive.hpp" не были разделены вместе с файлами "binary_? archive.hpp" давным-давно? (Разве библиотека сломана? Должна ли она быть исправлена?)
C) Есть ли способ решить это в коде приложения без изменения моей установки Boost?
P.S. Я использую Boost 1.48 и Visual Studio 2010 (64-разрядная версия)
P.P.S. Я полагаю, что все вышеизложенное применимо в равной степени к text_w?archive