我尝试编写我的c++迭代器的实现,但遇到了一些问题。当我尝试在基于范围的for中迭代时,得到的错误是我的迭代器没有合适的"begin“函数,并且没有找到。我编写了begin()和end()函数。怎么了?
#include <iostream>
template<typename T>
class iter final {
private:
T* current_ = nullptr;
T* end_ = nullptr;
int n;
public:
iter(T* first) :current_(first) {};
iter() {};
inline T& operator+ (int n) { return *(current_ - n); }
inline T& operator- (int n) { return *(current_ - n); }
inline T& operator++ (int) { return *current_++; }
inline T& operator-- (int) { return *current_--; }
inline T& operator++ () { return *++current_; }
inline T& operator-- () { return *current_--; }
inline bool operator!= (const iter& it) { return current_ != it.current_; }
inline bool operator== (const iter& it) { return current_ == it.current_; }
inline T& operator* () { return *current_; }
inline iter<T>* begin() { return current_; }
inline iter<T>* end() { return end_ + n; }
inline void set_current(T* _current) { current_ = _current; }
inline void set_end(T* _end) { end_ = _end; n = (end_ - current_) / sizeof(_end); }
inline void set_num(int num) { n = num; }
};
template<typename T>
class shuffle_range final {
public:
shuffle_range() { it = new iter<T>; };
~shuffle_range() { delete it; };
iter<T>* it;
};
template<typename T>
iter<T>* make_shuffle(T* begin, T* end) {
static shuffle_range<T> shuffler;
shuffler.it->set_current(begin);
shuffler.it->set_end(end);
shuffler.it->set_num(end - begin);
return shuffler.it;
}
int main() {
int a[] = { 0, 4, 5, 2, 8, 1 };
auto shuffle_a = make_shuffle(a, (a + 5));
for (auto i : shuffle_a)
std::cout << i << " ";
return 0;
}发布于 2020-07-05 00:35:33
对于你的问题- make_shuffle返回了一个指向iter<T>类的指针,这意味着为了迭代这个实例,你需要获取指针值:
for (auto i : *shuffle_a)
std::cout << i << " ";但是,请注意,您的end函数实现还有另一个问题。它检查end_ + n而不是end_或current_ + n。我的建议是摆脱其中一个(选择你使用的),并使用一个函数来获得另一个。例如,您可以添加size()成员函数来获取n
inline size_t size() { return (end_ - current_) / sizeof(end_); }发布于 2020-07-05 00:05:07
C++中的for each循环只是对正常的for循环的掩码,该循环从头到尾遍历相同类型的对象的给定列表。它甚至让converted变成了1。因此,在这种情况下,编译器不知道如何处理for-each循环。如果你使用一个普通的for循环会更好。类似于:
for(auto i = shuffle_a.begin(); i != shuffle_a.end(); i++) { //mind well!!! `end()` must return an iterator pointing to the element after the last element
<whatever>
}就足够了
https://stackoverflow.com/questions/62731179
复制相似问题