Шаблонные функции в шаблонных классах

Я создаю библиотеку, которая использует шаблоны выражений, где я активно использую шаблонные функции в классах. Весь мой код работает, и недавно я решил создать основной класс на основе шаблонов, позволяющих использовать его для данных различного типа. Однако я больше не могу специализировать свои функции. Как мне это решить? Я приложил небольшую тестовую программу, которая показывает проблему.

Мой предыдущий 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;
}

2

Решение

Это просто невозможно

[Temp.expl.spec]

16 В явном объявлении специализации для члена шаблона класса или шаблона члена, который появляется в области пространства имен, шаблон члена и некоторые из его вмещающих шаблонов класса могут оставаться неспециализированными, за исключением того, что объявление не должно явно специализировать шаблон члена класса, если его шаблоны классов также не являются явно специализированными.

7

Другие решения

Вы должны специализировать свой класс сначала. Затем специализируем функцию:

template<> template<>
void Animals<double>::printFood(const unsigned int& x) const { std::cout << "We don't want to eat " << x << "!" << std::endl; }
2

Вы не можете частично специализировать элементы шаблона для неспециализованного класса шаблона. Это согласуется с запретом частичной специализации шаблонных функций (представьте, что шаблонный класс является первым параметром функции-члена). Вместо этого используйте перегрузку:

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;
};
0
По вопросам рекламы [email protected]