class 和 typename 关键字

: 在模板参数表中,关键字 class 和 typename 的意义相同。
: C++标准引入 typename 关键字是因为有时必须要靠它来指导
: 编译器解释模板定义。
: 因此你可以认为这两个关键字在这里是等价的。
                          ~~~~~~~~~~~~~~~~仅在类型参数列表时候等价
typename 引入的初衷是用在区别是类型还是静态成员变量
如:someclass::joke
如果没有typename 修饰,就无法知道joke是类型还是静态成员变量
如果someclass中出现 typedef char* joke
则一定要typename指明。这才是typename的关键。

  --------------------------------------------------------------

C++ iso标准里面提供了一个typename的关键字,在template中的使用特别广泛,
希望你看了这篇文章能对它有所了解。

先看下面这个模板函数:
template<class T>
void f(T t){
  T::X();
}
根据你的经验,你能确定出X的定义是什么吗?显然可以有不止一种定义,在这里X可能
是T的一个内部类,
T::X()调的是构造函数,另外X也有可能是T的static function,那编译器在instantia
te时会怎么做?
如果使用typename关键字,写成这样:
template<class T>
void f(T t){
  typename T::X x;
}
可以明确告诉编译器X是个类型,从而避免让编译器解释X为一个static function而导致
生成一个语法错误。
下面是个完整的小例子,请用gcc编译(3.0最好),VC(6.0)在模板方面的表现很多人已经
批评过了:),VC7.0我还还没用过。
class A{
public:
 class X{};        //一个内部类X
 static void X();  //一个静态函数X()
};
void A::X(){};
template<class T>
void f(T t){
  typename T::X x; //如果去掉typename,按照C++规定,编译器会把T::X认为是静态
                   //函数而不是一个类型,从而产生一个编译错误。
};
void main()
{
 A a;
 f<A>(a);
}
另外,在声明时typename和class没有区别,下面两种都可以。
template<class T> void func(T t){}
template<typename T> void func(T t){} 

转载于:https://www.cnblogs.com/rowp/archive/2011/10/07/2200671.html

C++ 中,`typename` 关键字的主要作用是告诉编译器其后面的符号是一个类型名称(type name),而不是一个值(value),以避免编译器的歧义。具体来说,`typename` 关键字可以用于以下两种情况: 1. 在模板中使用嵌套类型时,需要使用 `typename` 关键字来告诉编译器其后面的符号是一个类型名称,而不是一个静态成员变量或函数。 例如,假设有以下的模板类: ``` template <typename T> class MyClass { public: typedef T value_type; ... }; ``` 如果在模板类的成员函数中使用 `value_type`,需要使用 `typename` 关键字告诉编译器其后面的符号是一个类型名称: ``` template <typename T> void MyClass<T>::foo() { typename MyClass<T>::value_type x; // 使用typename关键字 ... } ``` 2. 在使用模板时,需要使用 `typename` 关键字来告诉编译器其后面的符号是一个类型名称,而不是一个静态成员变量或函数。 例如,假设有以下的模板函数: ``` template <typename T> void foo(typename T::value_type x) { ... } ``` 如果在使用该模板函数时,传递的类型 `T` 中有一个名为 `value_type` 的嵌套类型,需要使用 `typename` 关键字告诉编译器其后面的符号是一个类型名称: ``` struct MyStruct { typedef int value_type; }; int main() { MyStruct s; foo<MyStruct>(s); // 使用typename关键字 ... } ``` 总之,`typename` 关键字的作用是告诉编译器其后面的符号是一个类型名称,以避免编译器的歧义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值