2014-06-12 160 views
0

沒有匹配我試圖建立一個模板的優先級列表(模板參數是T的數據和優先級優先級(例如,如果我有一系列具有成績的學生,T將是學生,他們的優先級將是他們的成績) 該列表包含一個Node類,每個節點包含數據,優先級和指向接下來節點'operator <<'(包括字符串和ostream和重載<<)在c + +

我試圖重載< <運營商節點和列表,以便我可以使用<<的列表(打印每個節點) 例如:如果我想打印一個名爲receptionHour列表,使用這條線: cout << endl << "containing: " << receptionHour << endl;

問題是,編譯器不能識別我實現的操作符,所以它不使用它們,行不會編譯。我得到每行的錯誤是:

敵不過 '操作< <'(操作數類型是 '的std :: basic_ostream' 和 'MTM :: PriorityQueue中::節點')

這裏是我對<<運算符的實現,用於列表(稱爲PriorityQueue)和節點。 節點(insode節點類女巫是列表類中:

template<class P, class TT> 
    friend ostream& operator<<(ostream& os, Node node){ 
     os << "["; 
     os << node.priority; 
     os << ","; 
     os << node.data; 
     os << "]"; 
     return os; 
    } 

列表(稱爲PriorityQueue中):

template<class P, class TT> 
friend ostream& operator<<(PriorityQueue<Priority, T>& queue, std::ostream& os){ 
    Node* nodePtr = queue.head; 
    Node node; 
    for(int i = 1; i < queue.sizePQ; i++) { 
     node = *nodePtr; 
     os << node; 
     nodePtr = node.next; 
    } 
    return os; 
} 

感謝

+0

您是否定義了'Priority'類? – Math

+0

爲什麼你的'operator <<'模板? – Neil

回答

0

您不使用模板也沒有operator<<超載!

(1)當你聲明template<class P, class TT>時,你使用這些模板的函數聲明應該是function(P first, Class<TT> second)儘管您的類定義(和其他函數)類似於template<class Name> Class(Name name),但您不能使用template<class T> function(Class<Name>),因爲模板函數名稱必須與模板類名稱匹配。

而且Node的重載不需要使用模板,你知道你正在使用哪種類型(Node)。

(2)在運算符<<的重載函數中,第一個參數必須是ostream對象。

+0

謝謝大家!它現在正在工作! – user3733449