此文章主要涉及C++中template与typename关键字的使用,正常情况下template用来定义模板,typename后面定义类型名字,除此之外还有些其他用处。

typename关键字告诉编译把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:

一个唯一的name(可以作为类型理解),嵌套在另一个类型中;

依赖于一个模板参数,就是说模板参数在某种程度上包含这个name,当模板参数是编译器在指认一个类型时便会产生误解,

如:

{{EJS0}}

你无法确定Base<int>::name是一个变量还是一个类型,编译器无法确认,需要更多的信息,所以要在前面添加一个typename关键字。

{{EJS1}}

类模板中的类

现在我们来声明一个类型:

{{EJS2}}

如果模板已经实例化,拥有具体类型,可以选择不使用typename前缀。

{{EJS3}}

如果还需使用模板类型,则必须使用typename前缀,否则会出现编译错误:类型 从属名称的使用必须以“typename”为前缀

我们可以更好地使用一个别名来使用这个类型

{{EJS4}}

或者直接使用typename

{{EJS5}}

类模板中的类模板

在类模板中使用

一个类模板的嵌套:

{{EJS6}}

类中的类模板需要使用template关键字标识

直接使用范围内的模板类型

{{EJS7}}

或者对类模板进行重新声明

{{EJS8}}