C++ - специализация шаблона функции не вызывается

У меня есть следующий код:

template<typename T>
bool validate(const T& minimum, const T& maximum, const T& testValue)
{
    return testValue >= minimum && testValue <= maximum;
}

template<>
bool validate<const char&>(const char& minimum, const char& maximum, const char& testValue)
{
    // Allows comparisons with char arguments, ignoring case    
    // Localize by calling previously defined function
    return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}

Первый шаблон используется для любых вводимых типов, а специализация — для литеральных символов. Код компилируется и запускается с main.cpp для его проверки, но после тестирования я обнаружил, что специализация не вызывается. Он вызывает основной шаблон. Я не могу понять, почему.


person Matt Welke    schedule 14.08.2015    source источник
comment
вам не следует специализироваться для <const char&> случая, но для <char> лучше всего вообще не специализироваться и предоставить перегрузку функции без шаблона   -  person Piotr Skotnicki    schedule 14.08.2015
comment
Когда я попытался это сделать, я получаю сообщение об ошибке компилятора: error: template-id 'validate‹char›' for 'bool validate(char, char, char)' не соответствует ни одному объявлению шаблона. К сожалению, поскольку это домашнее задание, я не могу изменить код в main.cpp. Я должен использовать специализацию шаблона.   -  person Matt Welke    schedule 14.08.2015
comment
если T=char то параметры останутся const char&   -  person Piotr Skotnicki    schedule 14.08.2015
comment
Код вел себя так, как ожидалось после! Большое спасибо. :)   -  person Matt Welke    schedule 14.08.2015


Ответы (1)


Специализация template <> bool validate<const char&> выбирается компилятором, когда параметр шаблона типа T из основного шаблона выводится или явно указывается равным const char&. Для вызова validate('a', 'b', 'c') T выводится как char, а это не соответствует ожиданиям специализации.

Либо укажите специализацию для char (то есть не const char&):

template <>
bool validate<char>(const char& minimum, const char& maximum, const char& testValue)
{
    return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}

или определить перегрузку как нешаблонную:

bool validate(char minimum, char maximum, char testValue)
{
    return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
person Piotr Skotnicki    schedule 14.08.2015
comment
Это было очень информативно. Спасибо, что объяснили мне этот процесс. - person Matt Welke; 15.08.2015