Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';我使用std::迭代器<>;::引用模板?_C++_Templates_Iterator - Fatal编程技术网

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