2012-04-20 16 views
5

私の宿題の割り当てでは、リンクされたリストを作成しなければならず、テンプレートクラスでなければなりません。この割り当てでは、Listという1つのテンプレートクラスと、Linkという別のネストされたテンプレートクラスが呼び出されます。ネストされたクラスが同じタイプのネストされたクラスを設計する方法

メソッドは、クラス定義の外で定義する必要があります。

私は割り当ての簡単なバージョンを作成して動作していますが、私のデザインにはエラーがあるようです。

#include <iostream> 
using namespace std; 

template <class T1> 
class A 
{ 
public: 
    template <class T2> 
    class B; 

    T1 _a; 
}; 

template <class T1> 
template <class T2> 
class A<T1>::B 
{ 
public: 
    T2 _b; 
}; 

int main() 
{ 
    A<int> a; 
    a._a = 5; 

    A<int>::B<int> b; 
    b._b = 10; 

    cout << a._a << " " << b._b << "\n"; 


    return 0; 
} 

私の主な質問はあなたが声明A<int>::B<int> b;から見ることができるように、ネストされたクラスは、同じタイプであろうから、ある、クラスBは、自動的に同じタイプのものでも持ってする方法はありますか?私の質問は理にかなっていますか?言い換えれば、私はA<int>::B b;とbを自動的にAと同じタイプにすることはできますか?例えば、私がA<double>::B<int>;を持っている状況は決してありません。

答えて

5

はい、ちょうどBをテンプレートにしないでください。 T1Bの定義はまだテンプレート引数Aを参照しています。代わりにA<int>::B<int>

template <class T1> 
class A 
{ 
public: 
    class B; 

    T1 _a; 
} 

さて、それは単にA<int>::Bです。

List<int>::Link<double>とにかく意味をなさないので、テンプレートであるという意味はありません。

+0

OK、私はそれがうまくいくことを考えていた、という問題点があったに違いありません私はエラーが発生し続けているので、私の構文で。私はもう一度それを試みます。 –

1

私はなぜあなたがあなたの内部クラスのテンプレートが必要だと思うか分かりません。あなたはそれを非テンプレートクラスとして宣言しようとしましたか?例えば

template <class T1> 
class A 
{ 
public: 
    class B; 
private:  
    T1 _a; 
}; 

template <class T1> 
class A<T1>::B 
{ 
    T1 _b; 
}; 

(私はそれは一例です実現しながら、また、私は公共データメンバーとの書き込みクラスに対してお勧めする)

+0

私はそれが必要ではないと思った、私はコンパイルするためのプログラムを得ることができなかったので、私は文法の間違いを考えていた。あなたのサンプルコードから修正することができました。ありがとう! –

関連する問題