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

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 に答える