Я создаю библиотеку, которая использует шаблоны выражений, где я активно использую шаблонные функции в классах. Весь мой код работает, и недавно я решил создать основной класс на основе шаблонов, позволяющих использовать его для данных различного типа. Однако я больше не могу специализировать свои функции. Как мне это решить? Я приложил небольшую тестовую программу, которая показывает проблему.
Мой предыдущий Animal
класс не был шаблонным, а затем этот код работает нормально.
#include<iostream>
#include<vector>
// Example templated class with templated function
template<class T>
class Animals
{
public:
template<class X>
void printFood(const X& x) const { std::cout << "We eat " << x << "!" << std::endl; }
private:
std::vector<T> animals;
};
// How do I specialize?
template<class T> template<>
void Animals<T>::printFood(const unsigned int& x) const { std::cout << "We don't want to eat " << x << "!" << std::endl; }
// Main loop;
int main()
{
Animals<double> doubleAnimals;
const int banana = 42;
doubleAnimals.printFood(banana);
const unsigned int apple = 666;
doubleAnimals.printFood(apple);
return 0;
}
Это просто невозможно
[Temp.expl.spec]16 В явном объявлении специализации для члена шаблона класса или шаблона члена, который появляется в области пространства имен, шаблон члена и некоторые из его вмещающих шаблонов класса могут оставаться неспециализированными, за исключением того, что объявление не должно явно специализировать шаблон члена класса, если его шаблоны классов также не являются явно специализированными.
Вы должны специализировать свой класс сначала. Затем специализируем функцию:
template<> template<>
void Animals<double>::printFood(const unsigned int& x) const { std::cout << "We don't want to eat " << x << "!" << std::endl; }
Вы не можете частично специализировать элементы шаблона для неспециализованного класса шаблона. Это согласуется с запретом частичной специализации шаблонных функций (представьте, что шаблонный класс является первым параметром функции-члена). Вместо этого используйте перегрузку:
template<class T>
class Animals
{
public:
template<class X>
void printFood(const X& x) const { std::cout << "We eat " << x << "!" << std::endl; }
void printFood(const unsigned int& x) const { std::cout << "We don't want to eat " << x << "!" << std::endl; }
private:
std::vector<T> animals;
};