Для начала, как правило, нежелательно использовать специализацию шаблона как способ перегрузки функции шаблона.Специализации шаблонов плохо взаимодействуют с перегрузкой функций и имеют некоторые довольно загадочные правила, диктующие, когда они выбраны, и в целом считается, что лучше просто обеспечить обычную перегрузку функции, чем специализировать шаблон функции.Я бы посоветовал изменить ваш класс так, чтобы он выглядел следующим образом:
class A {
public:
template <typename T>
int f(uint32_t id, T const& t, bool cond);
int f(uint32_t id, int t, bool cond);
...
};
Затем измените специализацию шаблона, чтобы он был просто реализацией перегрузки.Из-за способа, которым работает перегрузка функции C ++, это позволит более точно выбрать правильную версию функции.
Что касается вашего конкретного вопроса, причина того, что ваш код не всегда вызывает перегрузку, состоит в том, что C ++ делаетразличие между перечисляемым типом и типом int
.Хотя существуют способы преобразования между int
s и перечислимыми типами, они не одно и то же, и перегрузка, предназначенная для перехвата int
s, также не гарантирует перехват перечислимых типов.Возможно, вам лучше перегрузить функцию, чтобы обработать перечислимый регистр.