3

テンプレートクラスが定義されています:

 template <class T>
    class TempClass
    {
    ...
    };

テンプレート クラスの関数にアクセスする MyClass.h でこのクラスのオブジェクトを作成したい場合、テンプレートの引数をどのように渡せばよいでしょうか。私は次のことをしようとしました:

class MyClass{
public:
    TempClass<T> temp;
}

確かに、T は MyClass で定義されていないため、機能しないと思われるため、正しく行う方法が少しわかりません。

ありがとう。

4

3 に答える 3

2

MyClassテンプレートにもなりたい場合は、次のようにします。

template<typename T>
struct MyClass {
    TempClass<T> temp;
};

class(の代わりに使用することもできますstructが、すべてのメンバーがパブリックであるため、デフォルトのプライベートは実際には必要ありません。)

MyClassテンプレートになりたくない場合は、代わりに具体的な型が必要になりTます。例えば:

struct MyClass {
    TempClass<string> temp;
};

ペダンティック: 技術的にはテンプレート クラスTempClassはなく、クラス テンプレートです。クラス テンプレートは、実際にはクラスではありません。それ自体がテンプレート クラスである個々のクラスを作成するために使用できるテンプレートです。したがって、はクラス テンプレートですが、 はテンプレート クラス --- テンプレートをインスタンス化することによって作成されるクラスです。TempClassTempClass<string>

于 2013-08-21T16:13:42.157 に答える
2

テンプレートはクラスではありません。は。その名前が意味するように、コンパイラがクラスを作成するのに役立つテンプレートです。つまり、テンプレート クラスがある場合template<typename T> class Foo{};:

template<typename T>
struct Foo
{
    T attribute;
};

Fooこれは、指定された型ごとに異なるバージョンの を生成するためにコンパイラが使用する唯一のテンプレートです。テンプレートをインスタンス化するとき、つまり、指定された型で生成されたクラスが必要であることをコンパイラーに伝えると、コンパイラーはFoo、テンプレート引数を指定された型に置き換えるコードのバージョンを生成します。

int main()
{
    Foo<int> foo_int_variable;
    Foo<bool> foo_bool_variable;
}

2 つのインスタンスを確認した後、コンパイラは次のようなコードを生成します。

struct __Foo_int
{
    int attribute;
};

struct __Foo_bool
{
    bool attribute;
};

したがって、main のコードは次のように変換されます。

int main()
{
    __Foo_int foo_int_variable;
    __Foo_bool foo_bool_variable;
}

答えは次のとおりです。コンパイラが正しいテンプレートのインスタンス化を生成できるようにするには、必要な型を指定する必要があります
あなたの例のように、を使用するクラスFooが Foo の特定のインスタンス化を必要とせず、汎用バージョンの を必要とするFoo場合、そのクラスもテンプレートにすることができます。

于 2013-08-21T16:13:54.910 に答える
1

たとえば、次のようにテンプレートをインスタンス化して、int をインスタンス化できます。

class MyClass
{
public:
  TempClass<int> temp;
};

しかし、それでも MYClass をジェネリックにしたい場合は、それもテンプレートにして、次のように定義できます。

template<typename T>
class MyClass
{
public:
  TempClass<T> temp;
};

任意の MyClass オブジェクトのインスタンス化でパラメーター T を定義します。次に例を示します。

MyClass<int> class;
于 2013-08-21T16:13:50.940 に答える