template 关键字的用法技巧
说明:
限定符包括:::,.,->
一、当类型名称具有以下性质是,就应该在该名称前面添加template前缀:
1.名称出现在一个模板中
2.名称是受限的
3.名称不是用于指定基类继承的列表中,也不是位于引入构造函数的成员初始化列表中
4.名称依赖于模板
而且,只有当前面三个条件同时满足时才能使用前缀template,例如:
template<typename T>
struct S:X<T>:Base{
S():X<T>::Base(typename X<T>::Base(0)){}
X<T> f(){//不能使用template
template X<T>::C *p;//指针p的声明
X<T>::D *q;//乘积
}
typename X<int>::C * s;//可有可无,因为不符合第四条规定
};
struct U{
X<int>::C * pc;//不能使用template,因为它并不是在模板中使用,U不是模板
};
二、如果一个模板名称是依赖型名称,需要在该名称前插入template关键字
例如:
template<typename T,int N>
class Weird{
public:
void casel(template Shell<T>::template In<N>::template Deep<N> * p){
}
}