3

次のコードを検討してください。

template <class x1, class x2 = int*>
struct CoreTemplate { };

template <class x1, class x2>
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } };

template <class x>
struct CoreTemplate<x*> { int spec; CoreTemplate() { spec = 3; } };

int main(int argc, char* argv[])
{
    CoreTemplate<int*, int*> qq1;
    printf("var=%d.\r\n", qq1.spec);

    CoreTemplate<int*> qq2;
    printf("var=%d.\r\n", qq2.spec);
}

MSVC はこのコードを適切にコンパイルし、両方のケースで 2 番目の特殊化を選択します。私にとって、これらの専門分野は同じです。最初の手で2番目の専門化はどのくらい合法ですか?

ちょっと興味がありますが、これについて何か考えはありますか?

4

1 に答える 1

4

2 番目の部分的な特殊化は正当であり、最初のものと同一ではありません。

2 番目の部分的な特殊化では、テンプレート引数リストに 2 番目のテンプレート パラメーターの引数がリストされていないため、既定の引数 を使用するint*ため、次と同等です。

template <class x>
struct CoreTemplate<x*, int*> { ... };

最初のテンプレート引数がポインター型で、2 番目のテンプレート引数がint*.

これは、最初のテンプレート引数がポインター型で、2 番目のテンプレート引数が以外 のポインター型である場合に使用される最初の部分的な特殊化よりも特殊化されていますint*

プログラムでは、qq1とを 2 番目のテンプレート引数として (明示的に、またはデフォルトの引数を使用して) 使用するため、両方とも 2 番目のインスタンス化を選択しますqq2int*

于 2012-06-22T00:53:18.983 に答える