gpt4 book ai didi

c++ - 我继承自 std::iterator,但编译器无法识别 'pointer' 或 'reference'

转载 作者:太空狗 更新时间:2023-10-29 23:32:38 25 4
gpt4 key购买 nike

我正在制作自定义迭代器,但我对是什么让编译器无法识别 pointerreference模板化迭代器实现情况下的 typedef。

下面的代码可以正常编译:

#include <iterator>

struct It : std::iterator<std::random_access_iterator_tag, int>
{
int *v;
pointer operator-> () { return v; }
reference operator* () { return *v; }

};

但是一旦我模板化了我的自定义迭代器,我就得到了错误:

#include <iterator>

template <class T>
struct It2 : std::iterator<std::random_access_iterator_tag, T>
{
T *v;
pointer operator-> () { return v; }
reference operator* () { return *v; }

};

whole code here

error: 'pointer' does not name a type
note: (perhaps 'typename std::iterator<std::random_access_iterator_tag, T>::pointer' was intended)
error: 'reference' does not name a type
...

1> 为什么编译器看不到 pointerreference std::iterator 中包含的定义?

根据note ,似乎我不应该费心使用 std::iterator 结构,而是我应该手动复制 typedef。但这似乎太容易出错,以防迭代器或 iterator_traits 将来获得额外的 typedef。

<强>2。您认为我应该如何处理这些特征的定义(pointerreference 等)?

最佳答案

1> Why can't the compiler see the pointer and reference definitions contained in the std::iterator ?

因为编译器无法排除您尝试提供 std::iterator 的特化,其中 pointerreference 不是类型定义, 从属名称永远不能在模板定义时解释为 typedef

2. How do you think I should deal with the definition of these traits (pointer, reference etc.) ?

虽然每次都使用 typename 显式限定它们,但您可以做的是将它们声明一次,并在 It2 的其余部分中依赖该声明> 定义:

#include <iterator>

template <class T>
struct It2 : std::iterator<std::random_access_iterator_tag, T>
{
using base = std::iterator<std::random_access_iterator_tag, T>;
using typename base::pointer;
using typename base::reference;
T *v;
pointer operator-> () { return v; }
reference operator* () { return *v; }
};

关于c++ - 我继承自 std::iterator,但编译器无法识别 'pointer' 或 'reference',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463581/

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