2009-08-19 8 views

答えて

7

T :: size_typeの前にtypenameを付ける必要があります。 なぜですか? "C++ Templates: The Complete Guide"

The language definition resolves this problem by specifying that in general a dependent qualified name does not denote a type unless that name is prefixed with the keyword typename.

... The typename prefix to a name is required when the name

  1. Appears in a template
  2. Is qualified
  3. Is not used as a list of base class specifications or in a list of member initializations introducing a constructor definition
  4. Is dependent on a template parameter

Furthermore the typename prefix is not allowed unless at least the first three previous conditions hold.

+0

私はこの節を読んだことがあります。ありがとうございます(自宅で読むことは130ページの詳細な説明をご覧ください)。私はまだ引数型宣言に "typename"が必要な理由は見当たりません。それは型でなければなりませんが、一般的な文との一貫性のためかもしれません。 –

+1

@wnissen:典型的には、パーサービルダーを幸せにするためのこのような要件があります。問題の一部は、明らかにそれが議論の宣言であることは明らかです。 "最も困惑する"問題のため、パーサは通常、()の間のトークンからそのことを推論しなければならない。さて、()間のトークンの解釈が引数宣言であることに依存していると言えば、循環解析の問題が導入されました。 – MSalters

29

あなたは型名を追加する必要があります。

I.e.

template <typename T> 
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex); 

T型に関する情報がなくても、コンパイラはT :: size_typeが型を指定していることを知る必要があります。標準から

、セクション14.6.2:

A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename .

0

は、それは私がT :: size_typeは型名たことを指定する必要が判明しました。何故ですか?

template <typename T> 
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex); 
+0

から

は、可能なインスタンス名と可能なタイプ名の間に明確にします。詳細は、C++のテンプレートを読んでください。完全なガイド - 情報はhttp://www.josuttis.com/tmplbook/tmplbook.html –

+1

で別の質問でなければなりません。 (それは以前に尋ねられていますが、ビットを検索してください) – jalf

3

テンプレート宣言の解析中に、Tがわからないためです。コンパイラはT :: size_typeが存在するかどうかを知りません。たとえば、静的変数を参照することがあります。後でテンプレートを使用すると、Tは当然知られていますが、エラーは早く発生します。

編集:-fpermissiveでコンパイルすると、おそらくコンパイラがあなたのコードを噛み砕くかもしれないが、彼は警告を発するだろう。

+0

gcc 4.0.1が最新のものです - Macの場合 – Tobias

+1

真であれば、Macを使わないもう一つの理由です。最新のプロダクション品質g ++は、4.4.0 –

+0

gcc 4.4.1です。 – hirschhornsalz