1、相同点
声明模板类型参数的时候,两者是完全等价的,不管是声明模板函数,还是声明模板类。推荐使用 typename ,更加见名思意。
示例代码:
//以下情况typename等同于class
template <typename T>
void compare(const T &t1,const T &t2)
{
//...
}
template <typename T>
class Animal
{
//...
};
2、区别
使用作用域运算符 :: 来访问成员时,默认访问的是静态成员,如果要访问的是类型成员,则需要使用 typename。
示例代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
template <typename T>
void print_container_template( const T &c )
{
//如果没有typename :error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“;”
for(typename T::size_type i = 0; i < c.size(); i++ )
{
cout << c[i] << " ";
}
cout << endl;
}
//by zhaocl
int main()
{
string s("biu biu biu");
print_container_template(s);
vector<int> ivec(10);
print_container_template(ivec);
system( "pause" );
return 0;
}