Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
То есть в примере выше (2) является специализацией не (3) а (1), поэтому для перегрузки будет выбран более подходящий базовый шаблон (3). Во втором же случае (6) является специализацией (5), которая в свою очередь является лучшей кандидатурой, чем (4).
fun{
x=0;
double x;
}
template<class T> void foo(T ) {...} // первый базовый шаблон
template<class T> void foo(T*) {...} // второй базовый шаблон
template<> void foo(int*) {...} // специализация второго шаблона
// как сделать специализацию первого шаблона для int* ?
template<> void foo(int*) { ... }T=int*, и второго с T=int int *x = new int;
foo(x);#include <cstdio>
#define SHOW(i) printf("%d : %s \n", i, __PRETTY_FUNCTION__)
template<class T> void foo(T) { SHOW(1); } // это - главное определение первого шаблона
template<> void foo(char*); // объявляем
auto fi = foo<int*>;
auto fc = foo<char*>;
auto fs = foo<short*>;
//template<> void foo(char*) { SHOW(2); } // это определение специализации первого шаблона
template<class T> void foo(T*) { SHOW(3); } // это - главное определение второго шаблона
template<> void foo(char*) { SHOW(4); } // это специализация ТОЛЬКО второго шаблона
template<> void foo(int*) { SHOW(5); }
template<class T> void bar(void(*p)(T*))
{
p(0);
}
int main()
{
fi(0); // 1
fc(0); // 2
fs(0); // 1
bar<int>(foo); // 5
bar<char>(foo); // 4
bar<short>(foo); // 3
}
Потому что второй шаблон замаскировал наличие первого, начиная с точки своего объявления.
template<class T> void foo(T) { SHOW(1); } // это - главное определение первого шаблона
auto fc = foo<char*>;
template<> void foo(char*); // объявляем
auto fi = foo<int*>;
auto fs = foo<short*>;
void foo(int*){}
Те кто ответил 3 и 6 могут сегодня потратить на торчание на хабре на полчаса больше рабочего времени чем обычно.
second base template, overloads (1)) и что явные специализации не перегружают (Specializations don't overload), отсюда и всё вытекает.
Перегрузка и специализация. Тонкий момент