我有兩個類,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