我做了什么?需要在模板化类的方法中实例化派生类

时间:2012-11-28 00:25:02

标签: c++ templates inheritance

我有一节课,说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..
    }
} ;

我该怎么做以及如何解决这个问题?

3 个答案:

答案 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)

另一种方法是编写一个全局函数,每个templatedeclare 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>
}