在C++迭代器类中重载*(迭代器+ n)和*(n +迭代器)?

exs*_*ape 0 c++ iterator operator-overloading operator-keyword

(注意:我正在编写这个项目仅供学习;有关冗余的评论是......呃,多余.;)

我正在尝试实现一个随机访问迭代器,但是我发现关于这个主题的文献很少,所以我将通过试验和错误结合维基多数运算符重载原型列表.到目前为止它运作良好,但我遇到了障碍.

代码如

exscape::string::iterator i = string_instance.begin();
std::cout << *i << std::endl;
Run Code Online (Sandbox Code Playgroud)

工作,并打印字符串的第一个字符.但是,*(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;
}
Run Code Online (Sandbox Code Playgroud)

以上失败(第632行当然是*(i + 2)行):

string.cpp:在函数'int main()'中:string.cpp:632:错误:'*exscape :: string :: iterator :: operator +(int)(2)'string中'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&)

我的猜测是我需要做更多的重载,但我不确定我缺少什么算子.

Dav*_*ler 9

您的+运算符返回一个const迭代器,但您没有const operator*.添加一个,我想你会没事的.或者,正如下面的xtofl所建议的那样,你可以制作你的operator*const.这是更好的设计,除非你operator*出于某种原因真的需要非const .

  • (当你走的时候,沿着`operator->`;) (2认同)