私は3つのファイルを持っています:
- domain.h は、いくつかの単純な構造体を定義します。フィールドの 1 つは boost::optional です
- convert.h は、プレーンな構造体を他の型に変換するテンプレートの特殊化を定義します。
- domain.h と convert.h を使用する lib.cpp
したがって、含まれるものは次のとおりです。
//domain.h
#include <boost/optional>
//convert.h
#include "domain.h"
#include <boost/optional>
//lib.cpp --- version 1 does not work
#include "domain.h"
#include "convert.h"
コンパイラ (VS2010) は、有益でないエラー メッセージを出しました。ブースト オプションのインクルードを追加してみました:
//lib.cpp --- version 2 works
#include <boost/optional>
#include "domain.h"
#include "convert.h"
ブースト/オプションのヘッダー インクルードが domain.h および/または convert.h から lib.cpp に引き継がれなかったのはなぜですか?
編集:
コンパイラは、boost::optional のテンプレートの特殊化を見つけることができると不平を言いました。
問題が見つかりました。boost::optional、convert-boost-optional.h の変換の特殊化を定義する別のファイルがあります。
convert.h を次のように変更すると
#include "domain.h"
#include <convert-boost-optional.h>
その後、バージョン1も機能します。バージョン 2 が convert-boost-optional.h をどこにも含めずにコンパイルされるのはなぜですか?
編集:私は混乱しました。私は実際<convert-boost-optional.h>
にバージョン 2 の lib.cpp に含めました。今ではすべてが理にかなっています。ごめん!