首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类嵌套类型typename

模板类嵌套类型typename
EN

Stack Overflow用户
提问于 2012-10-19 07:59:40
回答 3查看 1.6K关注 0票数 1

我必须声明Itertypename,但没有typedef

那么,我就不能在我的template class声明=>中使用=>了:

请教我如何使用Iter,否则解释为什么C++是如此的https://stackoverflow.com/questions/1085134/why-is-c-relatively-harder-to-use-bad-choice-for-a-beginner.

代码语言:javascript
复制
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声明为变量。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-19 08:02:49

  1. typedef可以与typename一起使用。因此,它变成: 类型名称vec::iterator Iter;
  2. 现在就使用Iter吧。 模板结构MyContainer {ty胡枝子Foo::vector;typedef void Vec::iterator Iter;void ( Iter );//ok Iter Bar ();//ok };
票数 7
EN

Stack Overflow用户

发布于 2012-10-19 08:13:01

只是为了补充之前的答案..。

代码语言:javascript
复制
typename Vec::iterator   Iter;

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

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

Officially, what is typename for?

票数 2
EN

Stack Overflow用户

发布于 2012-10-19 08:20:55

这一行:

代码语言:javascript
复制
typename Vec::iterator   Iter; 

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

看看你在这之后做了什么,你的意思可能是:

代码语言:javascript
复制
typedef  typename Vec::iterator   Iter; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12969854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档