无效初始化'int&amp;'类型的非const引用来自临时类型'MyClass <int> :: iterator *'</int>

时间:2009-11-20 19:51:47

标签: c++ reference iterator

我在尝试为链接列表类添加迭代器支持时,从g ++中收到以下错误。

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
}

我用谷歌搜索(当然也搜索了),并检查我的代码无济于事 - 要么我缺少一些基本的东西(也就是做一些愚蠢的事情),或者我缺少所需的知识。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

你正在返回一个临时对象的引用:this - p->data(我强调错字)计算指针间隔,操作的结果是临时右值:你不能从中获取引用

删除拼写错误:

this->p->data;

答案 1 :(得分: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