微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不能将 std::iterator<>::reference 与模板一起使用?

如何解决为什么我不能将 std::iterator<>::reference 与模板一起使用?

我尝试这样做

template <class V>
class myiterator: std::iterator<std::random_access_iterator_tag,V>{
    reference a;
};

就像这个例子

class myiterator: std::iterator<std::random_access_iterator_tag,int>{
    reference a;
};

但是我得到了一个错误“‘reference’没有命名类型”。如何将 std::iterator::reference 与模板一起使用?

解决方法

不会找到名称 reference,因为不会在依赖基类 std::iterator<std::random_access_iterator_tag,V> 中查找非依赖名称,该基类取决于模板参数 V

您可以将 reference 设为依赖名称:

template <class V>
class myiterator: std::iterator<std::random_access_iterator_tag,V>{
    typename std::iterator<std::random_access_iterator_tag,V>::reference a;
};

另一方面,非模板版本没有这样的问题。

,

名称reference是在基类中声明的,基类是一个依赖类型(它的类型依赖于V)。有适用于这种情况的特殊规则:当编译器看到名称 reference 时,它不会搜索依赖的基类范围,因此不会找到名称。为了强制编译器搜索依赖的基类作用域,您必须限定名称。

您可能认为 iterator::reference 可以解决问题。不幸的是,这也不起作用。 iterator 作为 std::iterator<std::random_access_tag,V> 的简写本身在基类中声明为它的“注入类名”。所以 iterator 也不会被找到,除非它被某些东西限定。

您可以长时间输入:typename std::iterator<std::random_access_tag,V>::reference a;。一种更易读的方式是:

using base = typename myiterator::iterator;
typename base::reference a;

您可以在 base:: 类定义的其余部分期间使用 myiterator 强制在基类范围内查找。

在 C++20 中,可以从这些上下文中省略 typename

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。