[英]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)
typedef
声明Iter
? 为什么不? template
class
使用Iter
? (例如,作为函数参数类型) 编辑
在指令typename Vec::iterator Iter;
关键字typename
表示Vec::iterator
是一种类型(即不是静态成员函数/属性)。 因此,不是将Iter
声明为类型,而是使用Vec::iterator
类型声明为变量。
typedef
可以与typename
一起使用。 这样就变成了:
typedef typename vec::iterator Iter;
现在就使用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 Vec::iterator Iter;
声明一个名为Iter
的成员变量,其类型为Vec::iterator
(即vector<T>::iterator
),而不是类型。
查看您在此之后所做的工作,可能意味着:
typedef typename Vec::iterator Iter;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.