2012-02-27 12 views
1

可能性の重複は:
使用する - C++ 11例

Where and why do I have to put the “template” and “typename” keywords?

これはStroustroup's FAQから再生されます。あなたがタイプを知らないときに使用されるtypename、例えば、テンプレートtemplate <typename> class some_classを見ました。下の例でtypenameが使われているのはなぜですか?

template<class T> void printall(const vector<T>& v) 
    { 
     for (auto p = v.begin(); p!=v.end(); ++p) 
      cout << *p << "\n"; 
    } 

In C++98, we'd have to write 

    template<class T> void printall(const vector<T>& v) 
    { 
     for (typename vector<T>::const_iterator p = v.begin(); p!=v.end(); ++p) 
      cout << *p << "\n"; 
    } 

答えて

1

あなたの例はまさに典型的な例です。 vector<T>はテンプレート化されたパラメータTとともに使用されるので、::const_iteratorが型であることをコンパイラに伝えなければなりません。これはコンパイラがどのTの場合でもvector<T>タイプがタイプという名前のconst_iteratorを持つことをコンパイラに知らせるのに役立ちます。

+0

したがって、反復子はコンテナの種類だけでなく、それが保持するものにも依存します。ベクトルの反復子はベクトルの反復子とは異なりますか? –

+0

ベクトルは完全に指定されているので、コンパイラはその時点で他の型のように使用できます。 –

+0

@GuyMontag - コンパイラは 'ベクトル :: const_iterator'が型であることを全く知りません。これはメソッドまたは静的データメンバである可能性があり、コンパイラは 'vector'テンプレートから具体的な型を作成するまで知らないでしょう。 –

関連する問題