質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1051閲覧

C++ 演算子のオーバーロードと ::reference がわかりません

mkn66

総合スコア41

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2022/01/09 16:56

c++を勉強しているものです。
学んでいる途中にどうしてもわからないことがあったので質問させていただきました。

C++

1template < typename Array > 2struct array_iterator 3{ 4 Array & a ; 5 std::size_t i; 6 array_iterator( Array & a,std::size_t i ) 7 : a( a ), i(i){ } 8 9 10 typename Array::reference operator *() ここの部分がわかりません 11 //typename Array::reference array_iterator::operator *() 12 { 13 return a[i] ; 14 } 15 16 array_iterator & operator ++() 17 { 18 ++i; 19 return *this; 20 } 21 22} ; 23 24 25template < typename T, std::size_t N > 26struct array 27{ 28 using iterator = array_iterator<array<T, N>>; 29 using value_type = T ; 30 using reference = T & ; 31 using const_reference = T const & ; 32 using size_type = std::size_t ; 33 34 size_type size() 35 { 36 return N; 37 } 38 39 value_type storage[N] ; 40 41 42 reference operator [] ( size_type i ) 43 { 44 return storage[i] ; 45 } 46 47 48 49} ;

std::arrayを実装するコードです

std::arrayのイテレーターの実装の部分の
typename Array::reference operator *()
のとこの ::reference が何を表しているかがわかりません
また Array & operator *()
ではなぜダメなのかを教えて欲しいです。

加えて,先ほどの下の部分のある
//typename Array::reference array_iterator::operator ()
は自分が学んでいる教材に書かれていた宣言ですが,
宣言の部分をこれにするとエラーが出ます。
教材が間違っているのでしょうか?
それとも自分が間違っているのでしょうか?
エラーメッセージは下記です。
extra qualification on member 'operator
'

環境は
Visual Studio Code
M1 mac big sur
です

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

::referenceはstruct arrayの中でusing reference = T&; で宣言されている型名エイリアスです。

typename Array::reference operator *() は
T& operator *() の意味になります。
ここでtypenameを書いているのは::referenceがメンバ変数と曖昧になるため型名であることを明示するためのものです。

教材の方は書き間違いだと思いますが古いコンパイラだとOKだったみたいです。
MSDN : コンパイルエラーC4596

投稿2022/01/09 19:57

vann_2921

総合スコア190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkn66

2022/01/10 03:07

わかりやすい説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問