Вам необходимо изменить параметр шаблона в объявлении специализации и аргумент шаблона при его вызове. В противном случае будет вызван основной шаблон. Например,
template<>
uint8_t pixelToLevel<uint8_t, const rgb8&>(const rgb8& p) { // <---------- line X
return pixelToLevel<uint8_t, uint8_t>(p.r());
}
, затем
pixelToLevel<uint8_t, const rgb8&>(rgb8());
LIVE
РЕДАКТИРОВАТЬ
Дано pixelToLevel<uint8_t>(rgb8());
, вывод аргумента шаблона выполняется с первичным шаблоном, а P
выводится как rgb8
(он не будет выводиться как const rgb8&
с объявлением параметра текущего первичного шаблона), тогда версия специализации вызываться не будет .
Вы можете применить перегрузку вместо специализации шаблона. например,
template<typename L, typename P>
L pixelToLevel(P p) {
return static_cast<L>(p);
}
template<typename L>
L pixelToLevel(const rgb8& p) { // <---------- line X
return pixelToLevel<L, uint8_t>(p.r());
}
Тогда pixelToLevel<uint8_t>(rgb8());
выберет 2-ю перегрузку.
LIVE