#c #templates #c 11 #operator-overloading #iostream
#c #шаблоны #c 11 #оператор-перегрузка #iostream
Вопрос:
я пытаюсь написать реализацию очереди приоритетов на c .
это класс элемента приоритетной очереди:
template <class Priority, class T>
class PriorityQueueElement {
public:
Priority priority;
T* data;
private:
PriorityQueueElement* next ;
public:
PriorityQueueElement( const Priorityamp; priority,T data ) :
priority(priority) ,data(amp;data) , next(NULL){
}
// ... other functions .. //
template <class P, class Y>
friend ostreamamp; operator<<(ostreamamp; os ,const PriorityQueueElement<P,Y>amp; element);
};
и функция :
template<class Priority, class T>
ostreamamp; operator<<(ostreamamp; os ,const PriorityQueueElement<Priority,T>amp; elemen){
return os << "[" << elemen.getPriority() << "," << elemen.getData( ) << "]";
}
я получаю сообщение об ошибке:
Multiple markers at this line
- template argument deduction/substitution failed:
- template<class Priority, class T> std::ostreamamp; mtm::operator<<(std::ostreamamp;, const
mtm::PriorityQueueElement<Priority, T>amp;)
Multiple markers at this line
- required from 'std::ostreamamp; mtm::operator<<(std::ostreamamp;, const mtm::PriorityQueueElement<Priority, T>amp;) [with Priority = int; T = int; std::ostream =
std::basic_ostream<char>]'
- required from 'std::ostreamamp; mtm::operator<<(std::ostreamamp;, const mtm::PriorityQueueElement<Priority, T>amp;) [with Priority = double; T = Student;
std::ostream = std::basic_ostream<char>]'
и если я попытаюсь использовать:
template <class Priority,class T>
я получаю сообщение об ошибке затенения шаблона в самом классе
спасибо за вашу помощь!
Комментарии:
1. Не могли бы вы предоставить минимальный, полный пример, чтобы мы могли воспроизвести проблему?
2. Ваш конструктор принимает адрес переданного по значению параметра и сохраняет его в члене класса. Это … плохо.
Ответ №1:
Я скопировал ваш код и немного изменил ( для теста)
template<class Priority, class T>
ostreamamp; operator<<(ostreamamp; os, const PriorityQueueElement<Priority, T>amp; elemen)
{
return os << "[" << elemen.priority << "," << *elemen.data << "]";
}
И это работает, в основном я ставлю:
PriorityQueueElement<int, const char*> x( 1, "fsdfsdfsd" );
cout << x;
и это дало мне вывод: [1,fsdfsdfsd]
протестировано в Visual Studio 2013. Проблема, вероятно, где-то в другом месте