Частичная неоднозначность специализации шаблона
Я не могу понять, почему утверждение в основном неоднозначно.
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
Специализация шаблона более специализирована, чем другая, если каждый список аргументов, который соответствует первому, также соответствует второму, но не наоборот.
При просмотре X<int, T*, 10>
и X<T, T*, I>
:
-
X<int, float*, 10>
соответствует первому, но не второму.
-
X<float, float*, 10>
соответствует второй, но не первой.
Поэтому ни одна из них не является более специализированной, чем другая, и экземпляр шаблона, который соответствует обеим специализациям, не будет компилироваться.