J'ai deux classes, Foo<T>
et Bar<T>
, dérivées de Base
. Chaque instance remplace une méthode virtual Base* convert(ID) const
, où ID
est une instance d'un type qui identifie de manière unique une instanciation particulière de Foo
ou Bar
(prétendre qu'il s'agit d'un enum
). Le problème est que Foo::convert()
doit être en mesure de renvoyer une instance Bar
, et de même Bar::convert()
doit être en mesure d'instancier Foo
. Comme ce sont les deux modèles, cela entraîne une dépendance circulaire entre Foo.h
et Bar.h
. Comment résoudre ça?Résolution d'une dépendance circulaire entre les classes de modèles
Edit: Une déclaration avant ne fonctionne pas parce que la mise en œuvre de chaque méthode a besoin le constructeur de l'autre classe:
Foo.h
:
#include <Base.h>
template<class T> class Bar;
template<class T>
class Foo : public Base { ... };
template<class T>
Base* Foo<T>::convert(ID id) const {
if (id == BAR_INT)
return new Bar<int>(value); // Error.
...
}
Bar.h
:
#include <Base.h>
template<class T> class Foo;
template<class T>
class Bar : public Base { ... };
template<class T>
Base* Bar<T>::convert(ID id) const {
if (id == FOO_FLOAT)
return new Foo<float>(value); // Error.
...
}
L'erreur est, naturellement, "utilisation invalide de type incomplet".
dépendances cycliques sont rarement une bonne idée. Essayez de le refactoriser pour que la dépendance soit rompue. Une première idée serait de déplacer la méthode 'convert' dans une fonction libre qui dépend à la fois de' Bar' et 'Foo' ... –