3

プライマリテンプレートの場合:

template<typename A, typename B> class MyClass {...

テンプレートの特殊化では、違いは何ですか

template<typename A, typename B> class MyClass<int, float> {...

template<> class MyClass<int, float> {...
4

1 に答える 1

6

template<typename A, typename B> class MyClass<int, float> {...許可されるべきではありません。実際、正式なパラメータAとを指定する場合B、テンプレートはそれらを使用する必要があります。

2番目のケースはごく普通のことです。つまり、「自由」パラメーターなしで特殊化を行っていると言います。

中間のケースは

template<typename A> class MyClass<A, float> {...

これも有効です。ここでは、2番目のテンプレートパラメータのみを修正しています。

部分的な特殊化の考え方は次のとおりです。いくつかの正式なパラメーターを使用してテンプレートを作成し、それらを使用して初期テンプレートのパラメーターの制約を表現します。部分特殊化のパラメーターは、初期テンプレートパラメーターと同じである必要はありません。例:

template<typename X, typename Y, typename Z> class MyClass<X*, Y(Z&)> {...

あなたのケースに有効な部分的な特殊化になります。これは、「任意のタイプの場合XYおよびのテンプレートパラメータが一致する場合は、この特殊化を使用する」と読むことができます。コンパイラは、型パターンに一致させるために非常に巧妙である必要があります。ZMyClassX*Y(Z&)

于 2010-12-15T00:19:40.133 に答える