[英]Why can't I use std::iterator<>::reference with templates?
我試着這樣做
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
,因為不會在依賴基礎 class 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
在基礎 class 中聲明,基礎 class 是依賴類型(其類型取決於V
)。 有適用於這種情況的特殊規則:當編譯器看到名稱reference
時,它不會搜索依賴的基礎 class scope,因此找不到名稱。 為了強制編譯器搜索依賴的基本 class 范圍,您必須限定名稱。
您可能認為iterator::reference
可以解決問題。 不幸的是,這也不起作用。 iterator
作為std::iterator<std::random_access_tag, V>
的簡寫,它本身在基礎 class 內聲明為其“注入的 class 名稱”。 因此,除非它被某些東西限定,否則也不會找到iterator
。
你可以很長地輸入它: typename std::iterator<std::random_access_tag, V>::reference a;
. 一種更具可讀性的方式是:
using base = typename myiterator::iterator;
typename base::reference a;
您可以使用base::
在myiterator
ZA2F21ED4F8EBC2ABCBDCC 定義的 rest 期間強制在基礎 class scope 中查找。
在 C++20 中,可以從這些上下文中省略typename
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.