(注意:我写这个项目只是为了学习;关于它是多余的评论是......呃,多余的。;)
我正在尝试实现一个随机访问迭代器,但我发现关于这个主题的文献很少,所以我将通过反复试验结合维基百科的运算符重载原型列表。到目前为止它工作得很好,但我遇到了一个障碍。
代码如
exscape::string::iterator i = string_instance.begin();
std::cout << *i << std::endl;
工作,并打印字符串的第一个字符。但是,*(i + 1) 不起作用,*(1 + i) 也不起作用。我的完整实现显然有点太多了,但这是它的要点:
namespace exscape {
class string {
friend class iterator;
...
public:
class iterator : public std::iterator<std::random_access_iterator_tag, char> {
...
char &operator*(void) {
return *p; // After some bounds checking
}
char *operator->(void) {
return p;
}
char &operator[](const int offset) {
return *(p + offset); // After some bounds checking
}
iterator &operator+=(const int offset) {
p += offset;
return *this;
}
const iterator operator+(const int offset) {
iterator out (*this);
out += offset;
return out;
}
};
};
}
int main() {
exscape::string s = "ABCDEF";
exscape::string::iterator i = s.begin();
std::cout << *(i + 2) << std::endl;
}
以上失败(第 632 行当然是 *(i + 2) 行):
string.cpp:在函数'int main()'中:string.cpp:632:错误:'*exscape::string::iterator::operator+(int)(2)'字符串中的'operator*'不匹配。 cpp:105: 注意:候选人是:char& exscape::string::iterator::operator*()
*(2 + i) 失败:
string.cpp:在函数'int main()'中:string.cpp:632:错误:'2 + i'中的'operator +'不匹配string.cpp:434:注意:候选者是:exscape :: string exscape: :operator+(const char*, const exscape::string&)
我的猜测是我需要做更多的重载,但我不确定我缺少哪个运算符。