【发布时间】:2018-05-27 09:55:45
【问题描述】:
如果我取消注释该行,有人可以解释为什么以下内容无法编译
foo::const_iterator j = f.begin();,但如果我使用 foo::const_iterator j = f.cbegin(); 行,它会编译吗?我正试图让这条线像我的 std::vector 示例一样工作。
#include <vector>
struct foo {
struct node { };
node *first = nullptr, *last = nullptr;
struct base_iterator {
node* ptr;
base_iterator (node* n) : ptr(n) { }
};
struct iterator : base_iterator { using base_iterator::base_iterator; };
struct const_iterator : base_iterator { using base_iterator::base_iterator; };
iterator begin() { return iterator(first); }
const_iterator begin() const { return const_iterator(first); }
const_iterator cbegin() const { return const_iterator(first); }
};
// Test
int main() {
foo f;
foo::iterator i = f.begin();
// foo::const_iterator j = f.begin(); // Won't compile because f is not const.
// foo::const_iterator j = f.cbegin(); // Will compile fine.
std::vector<int> v;
std::vector<int>::const_iterator it = v.begin(); // Compiles even though v is not const.
}
【问题讨论】:
-
您为什么希望它起作用?不同的类型,和所有。对于
vector,它不会神奇地发生。迭代器旨在提供可用的转换。 -
我必须在迭代器和 const_iterator 类中进行哪些更改才能使其像
std::vector<int>::const_iterator一样工作? -
添加转换c'tor或转换运算符。
-
那么在
const_iterator类中定义操作符const_iterator& operator=(const iterator& other),或者类似的拷贝构造函数? -
不,不是赋值运算符。转换运算符。请稍等
标签: c++ pointers iterator overloading const-iterator