2013-11-23 7 views
6

は、私は、テンプレートコンストラクタを持つクラスを作成したい:C++標準では、テンプレート以外のクラスのテンプレートコンストラクタを使用できますか?

class foo 
{ 
    template <class T> foo(T var) {} 
}; 

これはVS2008でコンパイルするが、それは非標準の拡張である場合、またはC++標準で許可されていれば、私は見当がつかない。 【temp.mem]で

+5

これは許可されています。 – BoBTFish

+0

私は、少なくともストレートC++の点で、MSは標準を尊重しており、一般的には拡張のために標準から逸脱しているわけではありません。 – ChiefTwoPencils

+4

時にはとても便利です。コンパイルしてはならない理由はありません。コンストラクタは依然として関数であり、テンプレートベースである可能性があります。しかしコンストラクタには制限があります。 * explicit *テンプレートパラメータでは呼び出すことはできません。彼らは引数リストから推論可能でなければなりません。私。 'テンプレート foo(){T何か; ...} 'は動作しません。 – WhozCraig

答えて

6

テンプレートは、クラスまたはクラステンプレート内で宣言することができます。そのような テンプレートはメンバーテンプレートと呼ばれます。

コンストラクタはメンバであり、テンプレートにすることは明示的に禁止されていません。

たとえば、std::shared_ptrは、多くの場合、template constructorsです。