我有一节课,说A
template <typename T> class A
{
} ;
和一个派生自A<T>
的类,(保留类型通用性)
template <typename T> class B : public A<T>
{
} ;
出现了一种情况,我需要在B<T>
中声明的方法中实例化A<T>
。哦,哦。
template <typename T> class A
{
void go()
{
B<T> * newB = new B<T>() ; // oh boy, not working..
}
} ;
我该怎么做以及如何解决这个问题?
答案 0 :(得分:2)
您需要打破两个类之间的循环依赖关系。在这种情况下很简单:只需定义你的go()
函数:
template <typename T> class A
{
public:
void go();
} ;
template <typename T> class B : public A<T>
{
} ;
template <typename T>
void A<T>::go()
{
B<T> * newB = new B<T>() ;
}
我更喜欢不行的定义,即使在内联函数时也是如此,因为它避免了使用不必要的细节弄乱接口。我也更喜欢没有循环依赖(当然不是在base和derived之间),但它并不总是可以避免。
答案 1 :(得分:1)
您可以在继承之前转发声明类模板A
- 只需确保遵循类B
的定义,并在其中定义类A
模板相同的标题:
template <typename T> class A;
template <typename T> class B : public A<T> {};
template <typename T> class A
{
void go()
{
B<T> * newB = new B<T>();
}
};
答案 2 :(得分:0)
另一种方法是编写一个全局函数,每个template
类declare friend
void go( A<T> *a )
{
// Can now make a B<T>
B<T> *b = new B<T>() ;
// access b's and a's privates if this function
// is friend to A<T> and B<T>
}