Частичная неоднозначность специализации шаблона - PullRequest
12 голосов
/ 26 декабря 2011

Не могу понять, почему утверждение в main является неоднозначным.

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

1 Ответ

10 голосов
/ 26 декабря 2011

Специализация шаблона является более специализированной, чем другая, если каждый список аргументов, соответствующий первому, также соответствует второму, но не наоборот.

При взгляде на X<int, T*, 10> и X<T, T*, I>:

  • X<int, float*, 10> соответствует первому, но не второму.
  • X<float, float*, 10> соответствует второму, но не первому.

Поэтому ни один из них не является более специализированным, чем другой, и создание экземпляра шаблона, соответствующего обеим специализациям, не будет компилироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...