проблемы при попытке перегрузить << оператор в c 11

#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. Проблема, вероятно, где-то в другом месте