C++中,typename的作用有两个:

1.模板中用于引入一个模板参数

2.当访问一个类或结构体中的自定义类型的时候,用typename修饰,防止语法歧义。

考虑以下代码:

 

template<typename T>
void foo(const T& t)
{
// 声明一个指向某个类型为T::bar的对象的指针
	T::bar* p;
}
struct StructWithBarAsType
{
	typedef int bar;
};
int main()
{
	StructWithBarAsType x;
	foo(x);
}

 

函数foo中,编译器根本不知道T::bar是什么数据类型,甚至他会以为这是一个T中的一个变量。所以为了防止这种歧义,我们应该用typename来标识。

 

typename T::bar* p;

这样编译器就指导,bar是一种用户自定义的类型。