2013-10-24 8 views
1

Я хотел бы иметь класс шаблона очереди, который может определять внутреннюю структуру контейнера с помощью аргумента шаблона и специализировать функцию Top (поскольку другой контейнер использует другое имя функции для доступа к элементу front) например, следующий код:Функция класса частичная специализация с шаблоном аргументом

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(); 
} 

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

+0

Что именно это 'пустота I * 'равно ?, и независимо,' 'деталей имеет тип С, и никакой магии в одной функции члена не будет изменить это. – WhozCraig

+0

К сожалению ... извините ... это опечатка. Возвращаемый тип функции Top() должен быть I * вместо void I *. – Elliott

ответ

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(); } 
}; 
+0

Да! Он работает для моей реализации. Большое спасибо! :) – Elliott

Смежные вопросы