2013-08-22 19 views
34

を組み合わせた文の意味は、私はこのコードを見ています。 typenameはキーワードクラスで置き換えることができますが、typenameの2番目の使用方法は、テンプレート宣言で使用される名前がオブジェクト名ではなく型名であることをコンパイラに通知することです。C++ C++のヘッダファイルでのtypedefと型名

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

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

+1

'typename'は' typedef'の内側と外側で同じ使用法を持っています。より現実的な(並べ替え)例は、 'typedef typename std :: vector :: iterator Iter;' – chris

+0

@chrisとなります。_Mybase :: value_typeとvalue_typeは別々に、 "_Mybase :: value_type value_type"はどういう意味ですか? – Arvind

+5

そして、私はSchildtが帰ってきた。今すぐその本を焼く。 – chris

答えて

35

typedefは、コードで使用するための新しいタイプを省略名のように定義しています。

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

ここ型名はコンパイラがvalue_typeがタイプとない_MyBaseの内部オブジェクトであることを知らせています。

::の範囲です。 」のように「value_type」は「_MyBase」にあります。または含有物と考えることもできる。

+3

ここに「typename」は必要ですか? – aakashbhowmick

+0

それは文脈によって異なります。 _MyBaseがテンプレートパラメータに依存している場合(_MyBaseがテンプレートタイプの場合)、そうでない場合は必要ありません。あなたの状況に混乱している場合、コンパイラはエラーを出すことによってあなたを助けます。 – pippin1289

1

typename_Mybase::value_typeがタイプの名前であると言っているので、typedefはその事実を反映することができます。

+6

私はそれを含まないと何が変わるのですか?それはコンパイルされません、いくつかの警告がありますか?私はtypedef A Bと思った。すべての場合に正常に動作します。 – masterxilo

+3

私は同じことを考えていたので、誰かが@ masterxiloのコメントに答えることができれば素晴らしいだろう。 – RastaJedi

+1

@RastaJedi少なくともVisual Studioでは、この場合は 'typename'は必要ないと思われます。現在定義しているクラスがテンプレート化されていない限り、それを置くのは間違っています: 'typedef int Int; テンプレート 構造体B { \t typedef typename Int IInt; }; 'うまくいっていますが、' typedef int Int; 構造体B { \t typedef typename Int IInt; }; 'はそうではありません。 – masterxilo