Функция специализированного шаблона задачи - PullRequest
4 голосов
/ 20 ноября 2010

Я новичок в шаблонах. Я пытаюсь определить специализированный шаблон для шаблона функции, но мой компилятор возвращает ошибку. Это простая функция max, написанная только для практики шаблонов; вот код:

template <typename TYP1, typename TYP2> TYP1 maximum(TYP1& param1, TYP2& param2)
{
    return (param1 > param2 ? param1 : param2);
}

и специализированная функция:

template<> std::string maximum<std::string, std::string>(std::string prm1, std::string prm2)
{
    std::cout << "Inside specialized functiion\n";
    return (prm1.length() > prm2.length() ? prm1 : prm2);
}

Не имеет значения, пытаюсь ли я написать специализацию для std :: string или любого другого типа, включая мои собственные определенные классы - ошибка всегда одинакова:

"ошибка C2912: явная специализация; 'максимум std :: string (std :: string, std :: string)' не является специализацией шаблона функции ..."

IntelliSense предлагает: "нет экземпляра шаблона функции"

Что я должен изменить, чтобы этот компилятор работал правильно?

Заранее спасибо

Ответы [ 2 ]

10 голосов
/ 20 ноября 2010

Вы забываете & перед строками.Он ожидает ссылочные типы, ваша "специализация" использует типы значений.

template<> std::string maximum<std::string, std::string>(std::string &prm1, std::string &prm2)
3 голосов
/ 20 ноября 2010

Это не специализация, поскольку основной шаблон ожидает параметры TYP1& и TYP2&.Вы можете исправить свой код, используя:

template<> std::string maximum<std::string, std::string>(std::string &prm1, std::string &prm2)
{
    std::cout << "Inside specialized functiion\n";
    return (prm1.length() > prm2.length() ? prm1 : prm2);
}

Обратите внимание, что параметры взяты там по ссылке.

...