Возможный дубликат:
частичная специализация шаблона функции
Я нигде не могу найти решение для своей проблемы, потому что, если я буду искать по ключевым словам, которые я найду, я найду решения, подходящие для разных проблем. Я понимаю, что это нужно было задавать раньше, просто не могу найти решение.
Предположим, у меня есть шаблон функции:
template<class any> print(any value);
Я могу специализировать это так, скажем, int
:
template<> print<int>(int value)
{
std::cout << value;
}
Но теперь проблема, я хочу, чтобы это работало и с вектором. Поскольку векторный класс является классом шаблона, это становится сложным.
Специализируем функцию так:
template<class any> print<vector<any> >(vector<any> value) {}
Будет сгенерирована следующая ошибка (MinGW g ++):
FILE: error: function template partial specialization 'print<vector<any> >' is not allowed
Обратите внимание, что функция print является лишь примером.
Как я могу решить это?
Существует общий обходной путь, при котором функция-шаблон просто делегирует работу функциям-членам шаблона класса:
#include <vector>
#include <iostream>
template <typename T> struct helper {
static void print(T value) { std::cout << value; }
};
template <typename T> struct helper<std::vector<T>> {
static void print(std::vector<T> const &value) { }
};
template <typename T>
void print (T const &value) {
// Just delegate.
helper<T>::print (value);
}int main () {
print (5);
std::vector<int> v;
print (v);
}
Однако, если вы можете прийти с простой перегрузкой функций (как предложено ecatmur и Vaughn Cato), сделайте это.
Не пытайтесь специализировать шаблоны функций. Вместо этого используйте перегрузку
void print(int value)
{
std::cout << value;
}
а также
template<class any>
void print(vector<any> value) {}
Частичная специализация шаблона функции не допускается, поскольку это может привести к нарушениям правила одного определения. Обычно вы можете просто использовать перегрузку:
template<class any> print(vector<any> value) {}