2

通常、#include チェーンが循環する場合は、#include の 1 つを前方宣言に置き換えて解決し、この型に依存するすべての関数実装を cpp ファイルに移動します。代わりにヘッダーを #include します。

しかし、場合によっては、関数の実装を cpp ファイルに入れるのは良くありません。特に、テンプレートやインライン関数を扱う場合はそうです。

したがって、前方宣言を使用するのではなく、循環 #include チェーンを処理する他の方法はありますか?

ありがとう!

4

1 に答える 1

7

このような循環依存は、コードを理解しにくく、扱いにくくするため、制限する必要があります。

とはいえ、そのような依存関係が必要な場合もあります。そのような場合は、すべてのエンティティを 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
于 2010-10-24T02:07:30.350 に答える