テンプレート機能を書くには、私が宣言:グラム++「タイプではありません」というエラー
template <typename T>
T invertible(T const& container, T::size_type startIndex, T::size_type endIndex);
は、グラムでコンパイル++ 4.0.1私はエラーを得た:
error: 'T::size_type' is not a type
テンプレート機能を書くには、私が宣言:グラム++「タイプではありません」というエラー
template <typename T>
T invertible(T const& container, T::size_type startIndex, T::size_type endIndex);
は、グラムでコンパイル++ 4.0.1私はエラーを得た:
error: 'T::size_type' is not a type
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
- Appears in a template
- Is qualified
- Is not used as a list of base class specifications or in a list of member initializations introducing a constructor definition
- Is dependent on a template parameter
Furthermore the typename prefix is not allowed unless at least the first three previous conditions hold.
あなたは型名を追加する必要があります。
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
.
は、それは私がT :: size_typeは型名たことを指定する必要が判明しました。何故ですか?
template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);
から
は、可能なインスタンス名と可能なタイプ名の間に明確にします。詳細は、C++のテンプレートを読んでください。完全なガイド - 情報はhttp://www.josuttis.com/tmplbook/tmplbook.html –
で別の質問でなければなりません。 (それは以前に尋ねられていますが、ビットを検索してください) – jalf
テンプレート宣言の解析中に、Tがわからないためです。コンパイラはT :: size_typeが存在するかどうかを知りません。たとえば、静的変数を参照することがあります。後でテンプレートを使用すると、Tは当然知られていますが、エラーは早く発生します。
編集:-fpermissiveでコンパイルすると、おそらくコンパイラがあなたのコードを噛み砕くかもしれないが、彼は警告を発するだろう。
gcc 4.0.1が最新のものです - Macの場合 – Tobias
真であれば、Macを使わないもう一つの理由です。最新のプロダクション品質g ++は、4.4.0 –
gcc 4.4.1です。 – hirschhornsalz
私はこの節を読んだことがあります。ありがとうございます(自宅で読むことは130ページの詳細な説明をご覧ください)。私はまだ引数型宣言に "typename"が必要な理由は見当たりません。それは型でなければなりませんが、一般的な文との一貫性のためかもしれません。 –
@wnissen:典型的には、パーサービルダーを幸せにするためのこのような要件があります。問題の一部は、明らかにそれが議論の宣言であることは明らかです。 "最も困惑する"問題のため、パーサは通常、()の間のトークンからそのことを推論しなければならない。さて、()間のトークンの解釈が引数宣言であることに依存していると言えば、循環解析の問題が導入されました。 – MSalters