Tengo dos clases, Foo<T>
y Bar<T>
, derivadas de Base
. Cada uno reemplaza un método virtual Base* convert(ID) const
, donde ID
es una instancia de un tipo que identifica de manera única una instanciación particular de Foo
o Bar
(pretende ser un enum
). El problema es que Foo::convert()
necesita para poder devolver una instancia de Bar
, y del mismo modo Bar::convert()
debe ser capaz de crear una instancia de Foo
. Como ambas son plantillas, esto da como resultado una dependencia circular entre Foo.h
y Bar.h
. ¿Cómo resuelvo esto?Resolviendo una dependencia circular entre clases de plantilla
Editar: Una declaración adelantada no funciona debido a la aplicación de cada método necesita el constructor de la otra clase:
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.
...
}
El error es, naturalmente, "uso no válido del tipo incompleto".
dependencias cíclicas son rara vez es una buena idea. Intenta refactorizar para que la dependencia se rompa. Una primera idea sería mover el método 'convert' a una función libre que depende de' Bar' y 'Foo' ... –