gpt4 book ai didi

c++ - 迭代器方法无法从 Const_iterator 继承

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:58 24 4
gpt4 key购买 nike

代码有两个简化的向下迭代器 CitIt

It 公开继承自 Cit 以允许从 It 转换为 Cit,如 foo2。

我认为 It 会从 Cit 继承 int operator-(const self_type& other) const。但事实并非如此。为什么?

如果我使用 using operator-;,是否会使 It 继承 Cit< 的两个 operator- 方法?那是错误的。

测试:

#include <vector>

template<typename C>
class Cit {
typedef Cit<C> self_type;
public:
Cit(const C& container, const int ix)
: container_(&container), ix_(ix) {}

self_type operator-(const int n) const {
return self_type(*container_, ix_ - n);
}

int operator-(const self_type& other) const {
return ix_ - other.ix_;
}

const int& operator*() const { return (*container_)[ix_]; }

protected:
const C* container_;
int ix_;
};


template<typename C>
class It : public Cit<C> {
typedef Cit<C> Base;
typedef It<C> self_type;
public:
It(C& container, const int ix)
: Base::Cit(container, ix) {}

self_type operator-(const int n) const {
return self_type(*mutable_a(), ix_ - n);
}

int& operator*() const { return (*mutable_a())[ix_]; }

private:
C* mutable_a() const { return const_cast<C*>(container_); }
using Base::container_;
using Base::ix_;
};

template <typename C>
void foo(Cit<C>& it) {}

int main() {
typedef std::vector<int> V;
V a = {0, 1, 2, 3, 4, 5};
It<V> b(a, 2);
It<V> c(a, 2);
foo(b); // convert from It to Cit works.
b - c; // <----- This doesn't work. Why?
// Assert that result of (b - 1) is an It instead of a Cit.
*(b - 1) -= 1;
}

最佳答案

你的 It<>::operator-(const int n)隐藏所有 operator-来自基类 Cit<> .

您需要添加 using Cit<C>::operator-;It<>使这些运算符像这样可见:

template<typename C>
class It : public Cit<C> {
//...
public:
//....

using Cit<C>::operator-;

self_type operator-(const int n) const {
return self_type(*mutable_a(), ix_ - n);
}

https://godbolt.org/g/s76SSv

关于c++ - 迭代器方法无法从 Const_iterator 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50181674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com