繁体   English   中英

模板化类的嵌套类型typename

[英]templated class nested type typename

我必须将Iter声明为typename但没有typedef
然后,我无法在template class声明=>令人沮丧的中使用Iter :(
Iter我如何使用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. 如何在template class使用Iter (例如,作为函数参数类型)

编辑
在指令typename Vec::iterator Iter; 关键字typename表示Vec::iterator是一种类型(即不是静态成员函数/属性)。 因此,不是将Iter声明为类型,而是使用Vec::iterator类型声明为变量。

  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 }; 

只是为了增加上一个答案...

typename Vec::iterator   Iter;

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

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

正式来说,typename是什么意思?

这行:

typename Vec::iterator   Iter; 

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

查看您在此之后所做的工作,可能意味着:

typedef  typename Vec::iterator   Iter; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM