ホームページ >バックエンド開発 >C++ >C のテンプレート パラメーターに依存する基本クラスで非修飾名の検索が機能しないのはなぜですか?

C のテンプレート パラメーターに依存する基本クラスで非修飾名の検索が機能しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-04 11:43:10715ブラウズ

Why Doesn't Unqualified Name Lookup Work with Template Parameter-Dependent Base Classes in C  ?

テンプレート パラメーターに依存する基本クラスと非修飾名の検索

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::Vec_t)、Vec_t が認識されないことを示すコンパイラ エラーが発生します。

この問題を解決するには、次のようにします。型エイリアスの名前は B クラス内で完全修飾されている必要があります:

template<typename T>
class B : public A<T>
{
private:
    typename A<T>::Vec_t v;  // correct - fully qualified name
};

これは、クラス テンプレートまたはそのメンバーの定義における非修飾名検索では、基本クラスがテンプレート パラメーターに依存している場合、基本クラスのスコープは検査されません。したがって、コンパイラ エラーを回避するには、型エイリアスの名前を明示的に修飾する必要があります。

以上がC のテンプレート パラメーターに依存する基本クラスで非修飾名の検索が機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。