1

我必须声明Itertypename但没有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;中,关键字typenameVec::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时,编译器无法识别这iterator意味着类型,因为它是依赖于模板的名称。它也可以是Vec.

正式来说,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 回答