先看一个例子:

#include <vector>

template<typename T>

class Foo {

};

template<typename T>

void method()

{

std::vector<Foo<T> > vecFoo;

std::vector<Foo<T> >::iterator iter = vecFoo.begin();

}

编译是通不过的。

解决办法:

typename std::vector<Foo<T> >::iterator iter = vecFoo.begin();

就可以了。

Effective C++:了解typename的双重意义里做了解释。

需要用typename告诉解析器这是个类型,否则编译器会当做相应的静态变量来处理。比如,C是一个模板类:

C::iterator* x;编译器会理解为是C的静态变量乘上x……