1

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

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

4

3 回答 3

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>() ;
}

我更喜欢行外定义,即使在内联函数时也是如此,因为它避免了不必要的细节使界面混乱。我也更喜欢没有循环依赖(当然不是在基数和派生数之间),但它不能总是避免。

于 2012-11-28T00:35:28.413 回答
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>();
    }
};
于 2012-11-28T00:33:12.560 回答
0

另一种方法是编写一个全局函数,每个template类都声明朋友

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>
}
于 2012-11-28T00:39:12.597 回答