В этой строке using pina = GetPinWithPort<Porta, TPin<Porta, 1> >::type;
1 имеет тип int, а не uint32_t.Таким образом, вы создаете экземпляр GetPinWithPort<Porta, int>
(неспециализированное определение), а не GetPinWithPort<Porta, uint32_t>
.
Вот как должна выглядеть специализация для передачи нужного параметра шаблона в TPin:
template <typename TPort, uint8_t N>
struct GetPinWithPort<TPort, TPin<TPort, N>>
{
using type = TPin<TPort, N>;
};
Вот как это следует использовать:
using pina = GetPinWithPort<Porta, TPin<Porta, static_cast<uint8_t>(1)> >::type;
Причина этого заключается в том, что C ++ очень строго относится к использованию типов вместо шаблонов: допускается очень ограниченное преобразование типов.