質問: x.vec[i]; } return *this; } //--- 添字演算子[] ---// Type& operator[](int i) { if (!is_valid_index(i)) throw IdxRngErr(this, i); // 添字範囲エラー送出 return vec[i]; } //--- const版添字演算子[] ---// const Type& operator[](int i) const { if (!is_valid_index(i)) throw IdxRngErr(this, i); // 添字範囲エラー送出 return vec[i]; } }; #endif ```
回答: ``` class IdxRngErr { const Array *ident; int idx; public: IdxRngErr(const Array* p, int i) : ident(p), idx(i) { }//コンストラクタ int Index() const { return idx; }//要素数を返す関数 //ここです。↓///////////////////////////////////////// Array* Ident()const { return ident; }//indentを返す関数 }; ``` `class IdxRngErr` のメンバー変数`ident`の定義は `const Array *ident;` となっており、`const`修飾子により、ポインタ`ident`の指している先の`Array`の内容は変更できないようになっています。一方、`ident`を返す関数の定義は `Array* Ident()const { return ident; }` であり、戻り値には`const`が付いていないので、呼び出し側では`Array`の内容を変更できてしまいます。これはメンバー変数の定義と矛盾するのでエラーになっています。 `Ident() const`と、メンバー関数定義自体に`const`が付いているので紛らわしいですが、この`const`はクラス`IdxRngErr`の中身が関数呼び出しによっては変更されない、つまり`ident`の持っているアドレスと`idx`の値が変更されないという意味です。`ident`のアドレスが指している先の中身には`const`の効力は及びません。 エラーの直し方についてですが、クラスの設計意図によります。今回の場合、`IdxRngErr`クラスは例外通知に使われるクラスなので、それを使ってデータのアップデートを行うことはないだろうと思われるので、 `const Array* Ident()const { return ident; }//indentを返す関数` と戻り値に`const`を付ければよいと思います。