【发布时间】:2015-11-01 15:03:12
【问题描述】:
我正在制作自定义迭代器,但我很困惑
在模板化迭代器实现的情况下,是什么导致编译器无法识别 pointer 或 reference 类型定义。
以下代码编译良好:
#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; }
};
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>为什么编译器看不到std::iterator中包含的pointer和reference定义?
根据note,似乎我不应该打扰使用std::iterator 结构,而是我应该手动复制typedef。
但这似乎太容易出错,以防 iterator 或 iterator_traits 将来获得额外的 typedef。
2。您认为我应该如何处理这些特征的定义(pointer、reference 等)?
【问题讨论】:
-
@GrimFandango 我非常想纠正您在标题中的拼写错误。就像你不会说“美式”;)