2017-01-12 11 views
1

循環依存の次の例を考えてみましょう。循環依存を引き起こすクラステンプレート

クラスフーは、いくつかの静的な機能を提供する:

//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からなる

答えて

3

staticクラスのデータメンバは、その型の定義せずに宣言することができます私が探していた

template<class T> 
class T1; 
+0

素晴らしい、まさに!どうもありがとう – user3067395