注:
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
というコンパイル エラーがあちこちで発生しました。それは明らかです (!!!) が、それらは私のカスタムアーカイブに存在し、 Boost のバイナリ ベース クラスを使用していたときは問題なく動作していました。どうしたんだ?text_?archive
私が見つけたものと、私の一時的な - しかし望ましくない - 解決策:
髪を引き裂いて約 1 日ぐるぐる回った後、これが私が見つけたものです...
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" を 2 つの部分に分割し、"..._impl.hpp" ヘッダーのみを #include すると、すべてが機能します。(しかし、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