2014-06-21 60 views
0

即時嘗試編寫C++優先級隊列實現。嘗試超載時的問題<<運算符在C++中11

這是類優先級隊列元素:

template <class Priority, class T> 
class PriorityQueueElement { 

public: 
Priority priority; 
T* data; 

private: 
    PriorityQueueElement* next ; 
public: 

    PriorityQueueElement(const Priority& priority,T data) : 
     priority(priority) ,data(&data) , next(NULL){ 
    } 
    // ... other functions .. // 
    template <class P, class Y> 
    friend ostream& operator<<(ostream& os ,const PriorityQueueElement<P,Y>& element); 

}; 

和功能:

template<class Priority, class T> 
ostream& operator<<(ostream& os ,const PriorityQueueElement<Priority,T>& elemen){ 
     return os << "[" << elemen.getPriority() << "," << elemen.getData() << "]"; 
} 

即時得到錯誤:

Multiple markers at this line 
    - template argument deduction/substitution failed: 
    - template<class Priority, class T> std::ostream& mtm::operator<<(std::ostream&, const 
mtm::PriorityQueueElement<Priority, T>&) 
Multiple markers at this line 
    - required from 'std::ostream& mtm::operator<<(std::ostream&, const mtm::PriorityQueueElement<Priority, T>&) [with Priority = int; T = int; std::ostream = 
std::basic_ostream<char>]' 
    - required from 'std::ostream& mtm::operator<<(std::ostream&, const mtm::PriorityQueueElement<Priority, T>&) [with Priority = double; T = Student; 
std::ostream = std::basic_ostream<char>]' 

,如果我嘗試使用:

template <class Priority,class T> 

我得到一個有關在類本身的陰影模板的錯誤

感謝您的幫助!

+1

你能provid e是一個最小的完整示例,因此我們可以重現該問題? – dyp

+0

您的構造函數正在傳遞值參數的地址並將其存儲在類成員中。那很糟。 –

回答

0

我複製你的代碼,並修改了一下(測試)

template<class Priority, class T> 
    ostream& operator<<(ostream& os, const PriorityQueueElement<Priority, T>& elemen) 
    { 
     return os << "[" << elemen.priority << "," << *elemen.data << "]"; 
    } 

及其工作中,主要我把:

PriorityQueueElement<int, const char*> x(1, "fsdfsdfsd"); 
cout << x; 

,它給了我輸出:1,fsdfsdfsd]

上的Visual Studio 2013年 Problemem測試可能是別的地方