2013-03-23 42 views
2

我遇到了返回值/引用的問題。我正在寫一個模板(隊列),並且Front()函數應該從隊列的前面返回元素,但是出現錯誤 - No viable conversion from 'Queue<int>::Node' to 'const int'。當我刪除const時,我得到Non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'Queue<int>::Node',而引用/無引用的其他變體,const/no const給出了這兩個錯誤中的任何一個。我錯過了什麼?沒有從'Template <int> :: Memberclass'到'const int'的可行轉換

#include <iostream> 

using namespace std; 

template <typename T> 
class Queue 
{ 
    friend ostream& operator<< (ostream &, const Queue<T> &); 
private: 
    class Node 
    { 
     friend class Queue<T>; 
    public: 
     Node(const T &t): node(t) {next = 0;} 
    private: 
     T front; 
     T back; 
     T node; 
     Node *next; 
    }; 
    Node *front; 
    Node *back; 
public: 
    Queue() : front(0), back(0) {} 
    ~Queue(); 
    bool Empty() 
    { 
     return front == 0; 
    } 
    T& Front() 
    { 
     if (Empty()) 
      cout << "Очередь пуста." << endl; 
     else 
     { 
      T const & temp = *front; // error here 
      return temp; 
     } 
    } 
    /* ... */ 
}; 

template <class T> ostream& operator<< (ostream &, const Queue<T> &); 

int main() 
{ 
    Queue<int> *queueInt = new Queue<int>; 
    for (int i = 0; i<10; i++) 
    { 
     queueInt->Push(i); 
     cout << "Pushed " << i << endl; 
    } 
    if (!queueInt->Empty()) 
    { 
     queueInt->Pop(); 
     cout << "Pop" << endl; 
    } 
    queueInt->Front(); 
    return 0; 
} 
+2

如果有人在空隊列中調用'Front'(或拋出異常),則需要返回_something_。否則,你會得到未定義的行爲。 – Mat

+0

@Mat感謝您指出!我完全忘記了回來。 – Kaworu

+0

您的編譯器也可以指出它(啓用警告) - 雖然有時也需要啓用優化(需要流分析)。 – Mat

回答

0

Node類定義並沒有太大的意義:這是現在的樣子,每一個節點存儲3個數據值:frontbacknode。這個班級應該是三重隊列嗎?不過,在你的Front()函數中,你需要返回前端節點的「有效載荷」(即返回T類型的東西),而不是節點本身。事情是這樣的:

T& Front() 
{ 
    if (Empty()) 
     cout << "Очередь пуста." << endl; 
    else 
    { 
     return front->node; 
    } 
} 
+0

謝謝!它適用於此。至於'Node'類,'front'和'back'應該是指向隊列的第一個和最後一個元素的指針,但是我想我做錯了? – Kaworu

+0

@Kaworu你已經有'front'和'back'作爲'Queue'裏面'Node'的指針了,沒關係。爲什麼你需要在每個節點內部提及'front'和'back'? – Angew

+0

我不知道。現在我試圖弄清楚爲什麼我把它放在那裏首先)謝謝你指出這一點。 – Kaworu

0

更換

T const & temp = *front; 

T& temp = front->front; 

Queue<T>::front是一個指向Node,換句話說,*frontNode。您正在嘗試將Node分配給T& const,並且由於編譯器無法將其從Node轉換爲T,因此抱怨。現在,Node有一個成員也被稱爲front這是T和我假設這就是你想要返回,這就是修復。 (也許你想回到front->node你的意圖是我也不清楚。)

此外,還宣佈tempT const &Front返回。但是,Front返回的類型爲T&(非nonst),編譯器無法將const轉換爲非const。通過聲明tempconst(如在修復中),不再需要此類轉換。

相關問題