循環依存の次の例を考えてみましょう。循環依存を引き起こすクラステンプレート
クラスフーは、いくつかの静的な機能を提供する:
//Foo.h
#pragma once
#include "T1.h" //causes circular dependency
class Foo
{
public:
static void doSomething();
private:
static T1<int> t1;
};
//Foo.cpp
#include "Foo.h"
void Foo::doSomething(){
}
はFooを呼び出すテンプレートクラスT1の方法::のdoSomething()。
//T1.h
#pragma once
template<class T>
class T1
{
public:
void doSomething(T t);
};
#include "T1.tcc"
//T1.tcc
#pragma once
#include "T1.h"
#include "Foo.h" //causes circular dependency
template<class T>
void T1<T>::doSomething(T t){
Foo::doSomething();
}
FooにT1のオブジェクトが含まれているため、Foo.hにT1.hが含まれている必要があります。 T1.tccは、Fooの静的メンバー関数を呼び出すため、Foo.hを含める必要があります。 Foo.hはすでにインクルードガードによって保護されているので、Fooはこの時点で宣言されていません(おそらく)。
../T1.tcc:9:5: error: ‘Foo’ has not been declared
デザインの観点から見ると、T1にはFooのオブジェクトが含まれていないため、完全に正当なものではないでしょうか?
オブジェクトを値で保持するのではなく、T1へのポインタを格納している可能性がありますが、ヒープにt1を格納したくない場合は、この問題を回避する方法はありますか?
#include "T1.h"
を...と:ちょうど置き換えるFoo.h
からなる
素晴らしい、まさに!どうもありがとう – user3067395