0

私は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 に含めました。今ではすべてが理にかなっています。ごめん!

4

1 に答える 1

0

ヒアダーにはヘッダー ガードがないため、代わりにコードに配置できます。

#ifndef _BOOST_OPTIONAL_H_
#define _BOOST_OPTIONAL_H_
#include <boost/optional>
#endif

これを含めた両方のオカソインに配置すると、もう経験することはありません。


しかし、疑問に思われるかもしれません:ヘッダー ファイルにインクルードを含める必要は本当にあるのでしょうか?

ヘッダー ファイルにヘッダー ファイルの内容が必要な場合でも、ヘッダー ファイルをインクルードする必要がない場合があります。前方宣言と、それらを使用できない場合について学びます。

于 2012-11-16T17:24:35.517 に答える