2009-11-20 80 views
2

我在嘗試爲我的鏈接列表類添加迭代器支持時從g ++收到以下錯誤。從'MyClass'類型的臨時類型的非常量引用類型'int&'的無效初始化<int> :: iterator *'

 
LinkedList.hpp: In member function ‘Type& exscape::LinkedList<Type>::iterator::operator*() [with Type = int]’: 
tests.cpp:51: instantiated from here 
LinkedList.hpp:412: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘exscape::LinkedList<int>::iterator*’ 

可能的相關代碼片段:

LinkedList.hpp:

template <typename Type> 
class LinkedList { 
    private: 
     struct node { 
      struct node *prev; 
      struct node *next; 
      Type data; 
     }; 
    public: 
     class iterator : public std::iterator<...> { 
      node *p; 

     public: 
      Type &operator*(); 
     }; 
... 
}; 

template <typename Type> 
LinkedList<Type>::iterator::iterator(struct node *in_node) : p(in_node) {} 

template <typename Type> 
inline Type &LinkedList<Type>::iterator::operator*() { 
    return this-p->data; ///// Line 412 
} 

tests.cpp:

... 
LinkedList<int> l1; 
... 
LinkedList<int>::iterator it; 
for (it = l1.begin(); it != l1.end(); ++it) { 
    std::cout << "Element: " << *it << std::endl; ///// Line 51 
} 

我GOOGLE了(因此搜索的,當然),並檢查我的代碼無濟於事 - 要麼我失去了一些基本的東西(又名一些愚蠢的東西),或者我錯過了所需的知識。有什麼建議?

+5

看起來你可能會對線一個錯字412 – 2009-11-20 19:55:43

回答

5

你一個臨時的對象返回引用來證明:this - p->data(我強調錯字)計算一個指針間隔,並且該操作的結果是一個臨時右值:您不能從中獲取引用。

只需卸下錯字:

this->p->data; 
+0

呃!就是這樣,謝謝。我猜拼寫錯誤屬於前一類錯誤...;) – exscape 2009-11-20 20:09:24

2

的問題可以通過下面的代碼片段

struct A { 
    int a; 
    A *get() { return this - a; } 
}; 

int main() { A a = { 0 }; assert(&a == a.get()); } 

更換線412以下

return this->p->data; // "this->" is optional 
+0

其實,這 - >不是*總是*可選。當處理從其他模板類繼承的模板類時,可能需要它:http://www.comeaucomputing.com/techtalk/templates/#whythisarrow – Marius 2009-12-06 20:43:24

+1

@Marius,是的,但這裏是可選的。我不敢嘗試用我在C++中發現的所有適用於它們的異常來包含所有的陳述。這不會幫助人們,它偷走我的時間:) – 2009-12-07 19:58:27

相關問題