4

私はトピックジェネリッククラスを読んでいました.私はある時点で立ち往生しました.以下はコードの一部です

template <class StackType> class stack
{
    StackType stck[10];
    int tos;
public:
    stack() {tos=0;}
    void push(StackType ob);
    StackType pop();
};

私の質問はtemplate <class StackType> class stack、 には 2 つのクラスが作成されているということです (StackTypestack)?

つまり、コンパイラはこれをスタックを StackType などのネストされたクラスにするようなものとしてどのように扱うのでしょうか?

4

5 に答える 5

8

2 番目のクラスを作成するのではなく、StackType がユーザー指定の型に取って代わられるタイプ Stack の 1 つのクラスを作成しています。これを定義するより良い方法は、typename (§14.1.2) を使用することです。これにより、実際に何が起こっているのかがより明確になります。テンプレートの詳細については、C++ テンプレートを参照してください。

あなたが説明しているのは、テンプレート内のネストされたクラスです:

template <typename Type>
class Stack
{
public:
    class InnerType
    {
    };
};

この例では、InnerType は厳密な名前が であるクラスでありStack<Type>::InnerType、これは提供された型に基づく特定のクラスです。したがって、コードのどこかでオブジェクトが次のように作成された場合:

auto x = new Stack<int>();

タイプのクラスStack<int>::InnerTypeが存在します。テンプレート クラスは、コードで使用される場合にのみアセンブリに存在するため、 のバリエーションのオブジェクトStackが実装されていない場合、InnerType(テンプレート タイプの) は存在しません。

また、テンプレートの宣言に関する詳細については、 SO でここで説明します

于 2013-09-20T19:33:22.790 に答える
2

class内側と外側は<>意味が違います。と本質的に同じものtypenameです。

于 2013-09-20T19:32:33.557 に答える
2

したがって、テンプレートはクラスではありません。これは、テンプレートが int などのユーザー定義型からクラスを作成する方法です。だから私が言うとき:

stack<int>

コンパイラはクラスstack < int >からクラスを生成し、基本的にそのクラスを埋めてStackTypeコンパイルintします。

だから私が作るなら:

stack<stack<int> >

コンパイラは 2 つのクラスを生成しstact < int > stack < stack < int > >

于 2013-09-20T19:35:03.113 に答える
1

テンプレートはクラスのファミリを作成します。それぞれのクラスは同じ機能を持ちますが、異なる型で動作します。

あなたの例では、クラスのファミリーを作成しています。例: クラス X のスタック、クラス Y のスタックなど。

于 2013-09-20T19:38:34.267 に答える