Частичная специализация функции класса с шаблонным аргументом
Я хотел бы иметь класс шаблона Queue, который может определять внутреннюю структуру контейнера через аргумент шаблона и специализировать функцию Top (поскольку разные контейнеры используют разные имена функций для доступа к переднему элементу), например, следующий код:
template<class I, class C = std::queue<I>>
class Queue
{
C items;
public:
I* Top()
{
std::cout << "this is a queue" << std::endl;
return &items.front();
}
};
template<class I>
void I* Queue<I, std::priority_queue<I>>::Top()
{
std::cout << "this is a priority_queue" << std::endl;
return &items.top();
}
Однако этот кусок кода вызывает много ошибок компиляции. Кто-нибудь может дать мне подсказку, что я иду в неправильном направлении разработки шаблона класса? Благодарю.
1 ответ
Решение
Вы пытаетесь частично специализировать (членский) шаблон функции. Шаблоны функций не могут быть частично специализированы на C++. Вам придется частично специализировать весь класс или найти другие способы делать то, что вы хотите. Например, вы можете использовать черту в Top()
:
I* Top()
{
return MyQueueTraits<I, C>::GetTop(items);
}
template <class I, class C>
struct MyQueueTraits
{
static I* GetTop(C &c) { return &c.front(); }
};
template <class I>
struct MyQueueTraits<I, std::priority_queue<I>>
{
static I* GetTop(std::pirority_queue<I> &c) { return &c.top(); }
};