簡體   English   中英

為什么我不能將 std::iterator<>::reference 與模板一起使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM