我有两个类,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.
...
}
自然,错误是“不完整类型的无效使用”。
循环依赖很少是一个好主意。尝试重构它,以便依赖关系被破坏。第一个想法是将'convert'方法转换为一个依赖于Bar和Foo的自由函数... – 2010-07-28 15:17:15