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