C++ 应为l值:从宿主类内部调用自定义迭代器
我制作这个测试程序是为了从我的实际代码中复制错误。当注释掉C++ 应为l值:从宿主类内部调用自定义迭代器,c++,iterator,lvalue,C++,Iterator,Lvalue,我制作这个测试程序是为了从我的实际代码中复制错误。当注释掉stuff()时,在主函数中调用迭代器时,迭代器工作正常stuff()使编译器抛出错误。我猜原因是宿主类在编译时不是对象。。。所以不是l值?不幸的是,我不太知道用谷歌搜索什么来解释如何让这样的东西工作 #include <iostream> class Foo { class Iterator; public: Foo() { init(); } Iterator begin() {
stuff()
时,在主函数中调用迭代器时,迭代器工作正常stuff()
使编译器抛出错误。我猜原因是宿主类在编译时不是对象。。。所以不是l值?不幸的是,我不太知道用谷歌搜索什么来解释如何让这样的东西工作
#include <iostream>
class Foo
{
class Iterator;
public:
Foo() { init(); }
Iterator begin()
{
return Iterator(data);
}
Iterator end()
{
return Iterator(data+10);
}
void stuff()
{
for (auto i = begin(); i != end(); ++i)
{
1 + 1;
}
}
private:
class Iterator
{
public:
Iterator(int* i)
{
current = i;
}
bool operator!=(Iterator& rhs)
{
return rhs.current != current;
}
Iterator& operator++()
{
current = ++current;
return *this;
}
int* operator*()
{
return current;
}
private:
int* current;
};
void init()
{
for (int i = 0; i < 10; ++i)
{
data[i] = i;
}
}
int data[10];
};
int main()
{
Foo foo;
for (auto i : foo)
{
std::cout << *i << std::endl;
}
}
接线员!=应该是
const
方法,其参数应该是const迭代器&
current=++current代码>可以重写,就像++current
@SamVarshavchik ok,。但为什么这是解决方案呢?因为end()是一个临时值,一个右值(松散地说),临时值不能作为非常量引用传递,只能作为常量引用传递(您可以使用右值引用,但这是离题的)。从技术上讲,您可以使用非常量方法,但由于运算符不应修改其对象,它应为常量方法。
itertest.cpp:31:31: error: invalid operands to binary expression ('Foo::Iterator' and 'Foo::Iterator')
for (auto i = begin(); i != end(); ++i)
~ ^ ~~~~~
itertest.cpp:49:7: note: candidate function not viable: expects an l-value for 1st argument
bool operator!=(Iterator& rhs)