1

Iter私はとして宣言する必要がありますtypenameが、ありませんtypedef
次に、宣言で使用できませんIter= template class>イライラします:(
使用方法を教えてくださいIter、またはC++がとても厄介な理由を説明してください...

template <typename T>
struct MyContainer
{
  typedef  std::vector<T>  Vec;
  typename Vec::iterator   Iter;

  void Fo (typename std::vector<T>::iterator);  //ok
  typename std::vector<T>::iterator Ba();       //ok

  void Foo (Iter);   //error: 'Iter' is not a type
  Iter Bar ();       //error: 'Iter' does not name a type
};                   //(gcc 4.1.2)
  1. なぜtypedef宣言に使用できないのIterですか?なぜだめですか?
  2. Iter内での使用方法はtemplate class?(例えば、関数パラメータタイプとして)

編集
命令typename Vec::iterator Iter;でキーワードtypenameが言うVec::iteratorのはタイプです(つまり、静的メンバー関数/属性ではありません)。したがって、は型としてでIterはなく、型を使用する変数として宣言されますVec::iterator

4

3 に答える 3

7
  1. typedefと一緒に使用できますtypename。したがって、次のようになります。

    typedef typename vec::iterator Iter;
    
  2. Iter今すぐ使用してください。

    template <typename T>
    struct MyContainer
    {
      typedef  std::vector<T>         Vec;
      typedef typename Vec::iterator  Iter;
    
      void Foo (Iter);   //ok
      Iter Bar ();       //ok
    };
    
于 2012-10-19T08:02:49.997 に答える
1

前の答えに追加するだけです...

typename Vec::iterator   Iter;

は、型ではなく、という名前の変数を宣言する有効なC++ステートメントですIter

このキーワードtypenameは、後続の識別子がタイプであることを指定するために導入されました。を解析するとき、それはテンプレートに依存する名前であるため、コンパイラはそれが型を意味するVec::iteratorことを認識できません。の静的データメンバーである可能性もあります。iteratorVec

正式には、typenameは何のためにありますか?

于 2012-10-19T08:13:01.253 に答える
0

この行:

typename Vec::iterator   Iter; 

Iterタイプではなく、タイプVec::iterator(つまりvector<T>::iterator)の、と呼ばれるメンバー変数を宣言します。

この後あなたがしたことを見ると、おそらくあなたは次のことを意味していました:

typedef  typename Vec::iterator   Iter; 
于 2012-10-19T08:20:55.547 に答える