テンプレートの継承と非依存名の検索について理解します
次のコード スニペットを検討してください。
<code class="cpp">// arrayListType.h template <class elemType> class arrayListType { protected: elemType *list; int length; }; // unorderedArrayListType.h template <class elemType> class unorderedArrayListType: public arrayListType<elemType> { }; // main1.cpp unorderedArrayListType<int> intList(25);</code>
これをコンパイルするコードの結果、「長さはこのスコープで宣言されていません」というエラーが発生します。これは、親クラス arrayListType の保護された変数が、継承されたクラス unownedArrayListType に表示されないことを示します。
これは概念によるものです。非依存名検索として知られ、コンパイラがテンプレート内の非依存名への参照を解決する方法を定義します。非依存名とは、メンバー変数やメンバー関数名など、テンプレート パラメーターに依存しない名前です。
この場合、arrayListType 内の保護された変数は非依存名であり、明示的には指定されていません。 unownedArrayListType クラス定義で定義されます。コンパイラは、継承されたクラス内にこれらの名前が存在するかどうかを判断できないため、エラーを報告します。
エラーの修正
このエラーに対処するには、次の 2 つの一般的なアプローチがあります。
これを使用する->接頭辞:
非依存名の接頭辞として this-> を付けます。継承されたメンバーを参照することを明示的に示します:
<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> { public: void insertAt(int location, const elemType& insertItem) { this->length++; this->list[location] = insertItem; } };</code>
宣言の使用:
宣言の使用は、継承されたクラス内の非依存名を明示的に宣言します:
<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> { public: using arrayListType<elemType>::list; using arrayListType<elemType>::length; void insertAt(int location, const elemType& insertItem) { length++; list[location] = insertItem; } };</code>
どちらのメソッドも、非依存名が継承されたクラスに属していることをコンパイラーに効果的に伝え、コンパイルを正常に続行できるようにします。
以上がテンプレート派生クラス内の基本クラスの保護されたメンバーにアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。