2017-01-12 4 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(){ 
} 

푸 :: 해봐요를 호출 템플릿 클래스 T1의 방법().

//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의 개체가 들어 있으므로 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

관련 문제