13

メインのステートメントがあいまいな理由がわかりません。

template<class T, class U, int I> struct X
{ void f() { cout << "Primary template" << endl; } };


template<class T, int I> struct X<T, T*, I>
{void f() { cout << "Partial specialization 1" << endl;}};

template<class T, class U, int I> struct X<T*, U, I>
{void f() { cout << "Partial specialization 2" << endl;}};

template<class T> struct X<int, T*, 10>
{void f() { cout << "Partial specialization 3" << endl;}};

template<class T, class U, int I> struct X<T, U*, I>
{void f() { cout << "Partial specialization 4" << endl;}};

 int main()
 {
   X<int, int*, 10> f;
 }

X<int, T*, 10>最も専門的なテンプレートではありませんか? これはhttp://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htmの例です。

4

1 に答える 1

13

最初の引数リストに一致するすべての引数リストが 2 番目の引数リストにも一致するが、その逆ではない場合、テンプレートの特殊化は別のものよりも特殊化されています。

と を見るX<int, T*, 10>X<T, T*, I>:

  • X<int, float*, 10>最初のものには一致しますが、2 番目のものには一致しません。
  • X<float, float*, 10>は 2 番目に一致しますが、最初には一致しません。

したがって、どちらも他方よりも特殊化されているわけではなく、両方の特殊化に一致するテンプレートのインスタンス化はコンパイルされません。

于 2011-12-26T16:16:38.780 に答える