У меня есть два класса, Foo<T>
и Bar<T>
, полученные из Base
.Каждый переопределяет метод virtual Base* convert(ID) const
, где ID
- это экземпляр типа, который уникальным образом идентифицирует конкретное создание экземпляра Foo
или Bar
(представьте, что это enum
).Проблема в том, что Foo::convert()
должен иметь возможность возвращать экземпляр Bar
, а также Bar::convert()
должен иметь возможность создавать экземпляр Foo
.Поскольку оба они являются шаблонами, это приводит к круговой зависимости между Foo.h
и Bar.h
.Как мне решить эту проблему?
Редактировать: Форвардное объявление не работает, потому что реализация каждого метода нуждается в конструкторе другого класса:
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.
...
}
Ошибка, естественно, «неверное использование неполного типа».