순환 종속성의 다음 예제를 고려하십시오.순환 종속성을 야기하는 클래스 템플릿
클래스 푸 몇 가지 정적 기능을 제공합니다
//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
에서 그래서
멋진, 그냥 뭐 ! 고마워. – user3067395