Ожидаемое значение l: вызов пользовательского итератора из класса хоста
Я сделал эту тестовую программу, чтобы повторить ошибку из моего фактического кода. Итератор работает правильно при вызове в основной функции, когда 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;
}
}
Ошибка:
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)