Рассмотрим следующий пример циклической зависимости.Шаблон класса, вызывающий круговую зависимость
Класс Foo обеспечивает некоторую статическую функциональность:
//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 вызывает Foo :: 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.h должен включать T1.h, поскольку Foo содержит объект T1. T1.tcc должен включать Foo.h, поскольку он вызывает статическую функцию-член Foo. Поскольку Foo.h уже защищен защитой включения, Foo не объявляется в этот момент (я думаю).
../T1.tcc:9:5: error: ‘Foo’ has not been declared
С дизайнерской точки зрения, не это должно быть совершенно законно, поскольку T1 не содержит объект Foo?
Возможно, я мог бы хранить указатель на T1 вместо того, чтобы удерживать объект по значению, но в случае, если я не хочу хранить t1 в куче, есть ли другой способ избежать этой проблемы?
удивительным, только то, что я искал ! большое спасибо – user3067395