此文章主要涉及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}}