2

次のようなテンプレート特化クラスを作成します。

template <> class MEField<SField> {....};

このクラスをインスタンス化する方法を知りたいですか? 次のようなコードを書いているのが見えますMEField<> obj。そうですか?

関数の特殊化の場合、コンパイラーがパラメーターの特殊なタイプを判断できるため、通常どおりインスタンス化を行うことができます。授業に関してですが、本当の形式を教えていただけますか?

4

2 に答える 2

3

通常は他のテンプレートと同様に行いますMEField<SField> obj;。クラスのユーザーは、テンプレートを特殊化したかどうかに悩まされることはありません。使用するテンプレートのインスタンス化を決定するのはコンパイラ次第です。

于 2012-07-09T03:19:26.647 に答える
1

ここ、

template <> class MEField<SField> {....};

あなたがしたことは、明示的な専門化です。msdnが言うように、

コンパイラは、クラスまたは関数がインスタンス化されるときに、テンプレート クラスまたは関数のコードを生成します。

さらに、次のように述べています。

テンプレートが 1 回明示的にインスタンス化または特殊化されている場合、同じテンプレート引数のセットに対して同じプログラムで 2 回目に明示的にインスタンス化または特殊化することはできません。異なるテンプレート引数によるさらなる特殊化が許可されます。

したがって、標準的な方法はこのように書くことです。

MEField<SField> obj;

ただし、Jesse Good が言ったように、指定したデフォルトの型を使用するため、インスタンス化中に型を指定する必要がないデフォルトのテンプレート引数を使用できます。

以下のコードを参照してください(テスト済みコード)

class SField
{
public:
    int m_var;
    SField():m_var(0){}
};

template<typename T = SField> // Default template argument.
class MEField
{
public:
   T m_var;
};

template <>
class MEField<SField> // Explicit specialization
{
public:
   SField sField;
   void print(){ cout << sField.m_var; }
};

int main()
{
    MEField<> obj;
    obj.print();
}

参照:クラス テンプレートの既定の引数

于 2012-07-09T03:50:11.317 に答える