C では、クラス テンプレートを定義するときに、次の場合、非修飾名の検索中に基本クラスのスコープは検査されません。基本クラスはテンプレートパラメータに依存します。この動作は、C 標準の 14.6.2/3 で概説されています。
次のコードを考えてみましょう:
template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // fails - Vec_t is not recognized };
この例では、B クラスは A クラス テンプレートを継承しています。型エイリアス Vec_t が含まれています。ただし、B クラス内で Vec_t を完全修飾せずに使用しようとすると (つまり、A
この問題を解決するには、次のようにします。型エイリアスの名前は B クラス内で完全修飾されている必要があります:
template<typename T> class B : public A<T> { private: typename A<T>::Vec_t v; // correct - fully qualified name };
これは、クラス テンプレートまたはそのメンバーの定義における非修飾名検索では、基本クラスがテンプレート パラメーターに依存している場合、基本クラスのスコープは検査されません。したがって、コンパイラ エラーを回避するには、型エイリアスの名前を明示的に修飾する必要があります。
以上がC のテンプレート パラメーターに依存する基本クラスで非修飾名の検索が機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。