2017-01-12 3 views
1

Рассмотрим следующий пример циклической зависимости.Шаблон класса, вызывающий круговую зависимость

Класс 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 в куче, есть ли другой способ избежать этой проблемы?

ответ

3

static элементы данных класса могут быть объявлены без определения их типа, так что из Foo.h просто заменить:

#include "T1.h" 

... с:

template<class T> 
class T1; 
+0

удивительным, только то, что я искал ! большое спасибо – user3067395

Смежные вопросы