我必须将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)
typedef
无法用于声明Iter
?为什么不呢?Iter
template
中使用class
? (例如,作为函数参数类型) 编辑
在指令typename Vec::iterator Iter;
中,关键字typename
表示Vec::iterator
是一种类型(即不是静态成员函数/属性)。因此,Iter
未声明为类型,而是使用类型Vec::iterator
声明为变量。
答案 0 :(得分:7)
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
};
答案 1 :(得分:1)
只是添加到上一个答案......
typename Vec::iterator Iter;
是一个有效的C ++语句,它声明的不是类型,而是名为Iter
的变量。
引入了关键字typename
以指定后面的标识符是一种类型。解析Vec::iterator
时,编译器无法识别iterator
表示类型,因为它是依赖于模板的名称。它也可以是Vec
中的静态数据成员。
答案 2 :(得分:0)
这一行:
typename Vec::iterator Iter;
声明名为Iter
的成员变量,其类型为Vec::iterator
(即vector<T>::iterator
),而不是类型。
看看你之后做了什么,你可能意味着:
typedef typename Vec::iterator Iter;