通常、#include チェーンが循環する場合は、#include の 1 つを前方宣言に置き換えて解決し、この型に依存するすべての関数実装を cpp ファイルに移動します。代わりにヘッダーを #include します。
しかし、場合によっては、関数の実装を cpp ファイルに入れるのは良くありません。特に、テンプレートやインライン関数を扱う場合はそうです。
したがって、前方宣言を使用するのではなく、循環 #include チェーンを処理する他の方法はありますか?
ありがとう!
通常、#include チェーンが循環する場合は、#include の 1 つを前方宣言に置き換えて解決し、この型に依存するすべての関数実装を cpp ファイルに移動します。代わりにヘッダーを #include します。
しかし、場合によっては、関数の実装を cpp ファイルに入れるのは良くありません。特に、テンプレートやインライン関数を扱う場合はそうです。
したがって、前方宣言を使用するのではなく、循環 #include チェーンを処理する他の方法はありますか?
ありがとう!
このような循環依存は、コードを理解しにくく、扱いにくくするため、制限する必要があります。
とはいえ、そのような依存関係が必要な場合もあります。そのような場合は、すべてのエンティティを 1 つのヘッダー ファイルで宣言し、すべての宣言が関数テンプレートとインライン関数の定義を提供した後に行うことができます。例えば:
#ifndef MY_AWESOME_INCLUDE_GUARD
#define MY_AWESOME_INCLUDE_GUARD
template <typename> struct B;
template <typename T>
struct A
{
template <typename U>
void f(B<U>);
};
template <typename T>
struct B
{
template <typename U>
void f(A<U>);
};
template <typename T>
template <typename U>
void A<T>::f(B<U>) { }
template <typename T>
template <typename U>
void B<T>::f(A<U>) { }
#endif