1

重複の可能性:
テンプレート引数なしでテンプレート クラスを使用する

テンプレート化された関数がある場合、次のように引数から推測できるため、インスタンス化する必要はありません。

template<typename T> void MyFunc(T arg);

int x;    
MyFunc(x);

これは、コンパイラがテンプレート パラメーターを推測できるシナリオに当てはまりますか? 具体的には、次のように考えています。

template<typename T>
class MyClass {
public:
  MyClass(T) { }
};

int x;
MyClass<int> c1(x); // regular style
MyClass c2(x); // is this allowed?
4

3 に答える 3

4

はいといいえ。

コンパイラは、クラス テンプレート パラメーターの型を推測しませんが、既定値を許可します。したがって、intこのテンプレートをかなり使用している場合は、次のようにすることができます。

template <typename T=int>
class MyClass {
public:
    MyClass(T) {}
};

int x;
MyClass<> c2(x);

ただし、これはテンプレートごとに 1 つの特定のタイプに対してのみ機能することに注意してください。指定したパラメーターのタイプに基づいてタイプを選択するのではなく、テンプレートに指定したデフォルトを使用するだけで、タイプを指定せずに (たとえば) a を渡した場合、上記のテンプレートはではなく でdoubleインスタンス化されます.intdouble

コンパイラは関数テンプレートのテンプレート パラメーターを推測できる/推測するため、小さなテンプレート関数を作成して以下を使用することもできますauto

template <class T>
MyClass<T> make_MyClass(T const &v) {
   return MyClass<T>(v);
}

int x;

auto c2 = make_MyClass(x);
于 2012-12-12T20:53:03.483 に答える
3

いいえ、許可されていません。コンパイラはテンプレート関数の呼び出し中にのみ型を推測できるためです。

とはいえ、一般的な解決策はヘルパー関数です。

template<typename T>
class MyClass {
public:
  MyClass(T) { }
};

template<typename T>
MyClass<T> makeMyClass(T x)
{
  return MyClass<T>(x);
}
于 2012-12-12T20:50:12.587 に答える
2

いいえ、許可されていません。テンプレート パラメーターの推定は、テンプレート関数に対してのみ機能します。テンプレート クラスは、コンストラクターに指定されたパラメーターからテンプレート パラメーターを推定しません。

于 2012-12-12T20:48:00.050 に答える