此文章主要涉及C++中template与typename关键字的使用,正常情况下template用来定义模板,typename后面定义类型名字,除此之外还有些其他用处。
typename关键字告诉编译把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:
一个唯一的name(可以作为类型理解),嵌套在另一个类型中;
依赖于一个模板参数,就是说模板参数在某种程度上包含这个name,当模板参数是编译器在指认一个类型时便会产生误解,
如:
Base<int>::name a
你无法确定Base<int>::name是一个变量还是一个类型,编译器无法确认,需要更多的信息,所以要在前面添加一个typename关键字。
typename Base<int>::name a
类模板中的类
现在我们来声明一个类型:
template<typename T> struct Base { struct Normal {}; };
如果模板已经实例化,拥有具体类型,可以选择不使用typename前缀。
void Set() { Base<int>::Normal d; }
如果还需使用模板类型,则必须使用typename前缀,否则会出现编译错误:类型 从属名称的使用必须以“typename”为前缀
我们可以更好地使用一个别名来使用这个类型
template<typename T> void Set() { using Normal_proxy = typename Base<T>::Normal; Normal_proxy n; }
或者直接使用typename
typename Base<T>::Normal n;
类模板中的类模板
在类模板中使用
一个类模板的嵌套:
template<typename T> struct Base { template<typename TT> struct Nested { T d1; TT d2; }; };
类中的类模板需要使用template关键字标识
直接使用范围内的模板类型
template<typename T, typename TT> static void SS() { using Nested_proxy = typename Base<T>:: template Nested<TT>; Nested_proxy d; d.d1 = 3; d.d2 = 4; }
或者对类模板进行重新声明
template<typename T, typename TT> using Nested_proxy = typename Base<T>::template Nested<TT>;
文章评论