web-dev-qa-db-ja.com

C ++-typedefとtypenameを組み合わせたステートメントの意味

C++ヘッダーファイルには、次のコードが表示されます。

typedef typename _Mybase::value_type value_type;

さて、私が理解しているように、Schildtによる"C++ the Complete Reference"から引用しています。 typenameはキーワードクラスで置き換えることができます。typenameの2番目の使用法は、テンプレート宣言で使用される名前がオブジェクト名ではなく型名であることをコンパイラに通知することです。

同様に、キーワードtypedefを使用して、新しいデータ型名を定義できます。実際に新しいデータ型を作成するのではなく、既存の型の新しい名前を定義しています。

ただし、typedeftypenameを組み合わせた上記のコード行の意味を正確に説明できますか。そして、ステートメントの「::」は何を意味していますか?

52
Arvind

typedefは、短縮形のように、コードで使用する新しい型を定義しています。

typedef typename _MyBase::value_type value_type;
value_type v;
//use v

ここでtypenameは、value_type_MyBase内のオブジェクトではなく型であることをコンパイラーに知らせています。

::はタイプのスコープです。 「ある」というようなものなので、value_type "ある" _MyBaseです。または含まれていると考えることもできます。

54
pippin1289

typename_Mybase::value_typeはタイプの名前であるため、typedefはその事実を信頼できます。

3
Paul Evans