一、class与typename的相同点
typename关键字常用于函数模板,这里首先引入函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本
//函数模板格式
template<typename T1,typename T2,....,typename Tn>
返回值类型 函数名(参数列表){}
注意:typename是用来定义模板参数关键字,也可以使用class
//一段用于交换的函数模板
template<typename T>
void Swap( T& left, T& right)
{T temp = left;left = right;right = temp;
}
注意:在模板定义语法中关键字 class 与 typename 的作用完全一样
二、class与typename的不同点
以下面这段代码为例:实现一个vector容器的迭代器begin()功能,并函数模板的定义和实现分离
T是一个类模板的参数 是一个类型
C++语法规定 如果被视为是类型名的话 是需要用typename去声明定义的
typename暗示着这个参数不必要是一个 class type(类类型)
如果在声明位置模板用了class 下面只要用template还是会把T强制当做类型名
声明使用用class T的话 实现要么就不写关键字 要么就得显示typename 不能显示用class
template<class T>//报错
vector<class T>::iterator vector<class T>::begin()
{return _start;
}template<typename T>//允许
vector<T>::iterator vector<class T>::begin()
{return _start;
}template<class T>//允许
vector<typename T>::iterator vector<class T>::begin()
{return _start;
}template<typename T>//允许
vector<typename T>::iterator vector<class T>::begin()
{return _start;
}