2015-09-13 42 views
0

我試圖在雙鏈表類中實現下標操作符的重載,但是我面臨着我自己無法克服的問題。我對C++也很新穎。在模板雙向鏈表類中重載下標操作符

這就是我現在擁有的。從DLIST類

OUTTAKE:

T &operator[](int index) { 
    lookAt = root; 
    for (size_t i = 0; i < index; i++) { 
     lookAt = lookAt->getNext(); 
    } 
    return lookAt->getItem(); 
} 

Node<T>* root; 
Node<T>* lookAt; 
Node<T>* temp; 

Node類:

template <class T> 
class Node { 
public: 

Node() { 
    this->setNext(nullptr); 
    this->setPrev(nullptr); 
} 

Node *getNext() const { 
    return next; 
} 

void setNext(Node *next) { 
    Node::next = next; 
} 

Node *getPrev() const { 
    return prev; 
} 

void setPrev(Node *prev) { 
    Node::prev = prev; 
} 

T getItem() const { 
    return item; 
} 

void setItem(T item) { 
    Node::item = item; 
} 

private: 

Node* next; 
Node* prev; 
T item; 
}; 

我不斷收到錯誤是這樣的: 類型的非const引用無效初始化 '詮釋&' 從'int'類型的右值返回lookAt [index] .getItem();

這導致我相信我的item變量被引用的方式存在某種問題,或者/和重載函數的返回部分。

希望對此有所幫助/指導。

乾杯

+0

'getItem()'需要改變返回'T&',或者'operator []'需要返回'T',或者後者需要在不使用前者的情況下實現。實際上,你可能需要重載'getItem()'的兩個重載 - 一個返回'T&'的非const關鍵字和一個返回'T'或'const T'的const關係。 –

+0

奇怪的是'lookAt'和'temp'是成員變量而不是局部變量。 – Jarod42

+0

感謝評論!改變getItem()返回T&和去除const解決了這個問題。我是否認爲const必須被刪除,因爲對item的引用必須能夠改變?是的,這些變量應該是本地的。 – ludolover

回答

0

你的getItem()返回一個T-型變量,它是真正的數據的一個拷貝。 (右值)

您的[]操作員嘗試返回一個左值(參考值)T &。不過,我們不能將轉換成左值的右值。

一個可行的辦法是回到牛逼&在getItem()時,就像這樣:

T& getItem() { 
    return item; // Now returns a reference (lvalue). 
} 

希望它能幫助。

+0

是的!它做了。雖然我之前嘗試過這樣做 - 事實證明我也必須從getItem函數中刪除const部分。該函數是一個自動生成的getter,儘管如此,刪除的東西可能不是我懷疑的最佳解決方案。任何想法是什麼造成了這種情況? – ludolover

+0

Const函數禁止對變量進行可能的更改,並且[]運算符不是常量,因此可能導致更改。就像上面的註釋一樣,你可能需要兩個返回不同的東西的函數。自動生成的函數可能假設你想通過set函數修改你的數據,所以get函數只返回一個右值。 – user437716