模板化类嵌套类型typename

时间:2012-10-19 07:59:40

标签: c++ templates typedef nested-class typename

我必须将Iter声明为typename,而不是typedef
然后,我无法在Iter template声明=>中使用class令人沮丧:(
请教我如何使用Iter,或者解释为什么C ++是如此nasty ...

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? (例如,作为函数参数类型)
  3. 编辑
    在指令typename Vec::iterator Iter;中,关键字typename表示Vec::iterator是一种类型(即不是静态成员函数/属性)。因此,Iter未声明为类型,而是使用类型Vec::iterator声明为变量。

3 个答案:

答案 0 :(得分: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
    };
    

答案 1 :(得分:1)

只是添加到上一个答案......

typename Vec::iterator   Iter;

是一个有效的C ++语句,它声明的不是类型,而是名为Iter的变量。

引入了关键字typename以指定后面的标识符是一种类型。解析Vec::iterator时,编译器无法识别iterator表示类型,因为它是依赖于模板的名称。它也可以是Vec中的静态数据成员。

Officially, what is typename for?

答案 2 :(得分:0)

这一行:

typename Vec::iterator   Iter; 

声明名为Iter的成员变量,其类型为Vec::iterator(即vector<T>::iterator),而不是类型。

看看你之后做了什么,你可能意味着:

typedef  typename Vec::iterator   Iter;