C++ 为什么可以';我使用std::迭代器<>;::引用模板?
我试着这么做C++ 为什么可以';我使用std::迭代器<>;::引用模板?,c++,templates,iterator,C++,Templates,Iterator,我试着这么做 template <class V> class myiterator: std::iterator<std::random_access_iterator_tag, V>{ reference a; }; 模板 类myiterator:std::iterator{ 参考文件a; }; 就像这个例子一样 class myiterator: std::iterator<std::random_access_iterator_tag, int&
template <class V>
class myiterator: std::iterator<std::random_access_iterator_tag, V>{
reference a;
};
模板
类myiterator:std::iterator{
参考文件a;
};
就像这个例子一样
class myiterator: std::iterator<std::random_access_iterator_tag, int>{
reference a;
};
类myiterator:std::iterator{
参考文件a;
};
但是我得到了一个错误“'reference'没有命名类型”。如何将std::iterator::reference与模板一起使用?将找不到名称
reference
,因为不会在依赖基类std::iterator
中查找非依赖名称,这取决于模板参数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;
};
模板
类myiterator:std::iterator{
typename std::iterator::reference a;
};
另一方面,非模板版本没有这样的问题。名称
引用
在基类中声明,基类是依赖类型(其类型取决于V
)。有一些特殊规则适用于这种情况:当编译器看到名称引用时,它不会搜索依赖的基类范围,因此也不会找到名称。为了强制编译器搜索依赖的基类作用域,必须限定名称
您可能会认为,iterator::reference
会起到作用。不幸的是,这也不起作用iterator
作为std::iterator
的缩写,本身在基类中声明为其“注入的类名”。因此,迭代器
也不会被找到,除非它被某些东西限定
您可以用很长的方式键入它:typename std::iterator::reference a代码>。更具可读性的方法是:
using base = typename myiterator::iterator;
typename base::reference a;
您可以使用base::
在myiterator
类定义的其余部分中强制查找基类范围
在C++20中,可以从这些上下文中省略typename