typename关键字

在 template declaration(模板声明) 中class 和 typename 有什么不同?

1 class 和 typename 在声明一个 template type parameter (模板类型参数)时, class 和 template 是一样的东西。

template <class T> class Widget;
tempalte <typename T> class Widget; // the same as above
2 typename 在模板中标明 “内嵌依赖类型名”

// STL 中 iterator_traits 模板
 template <class _Iterator>
struct iterator_traits {
  typedef typename _Iterator::iterator_category iterator_category;
  typedef typename _Iterator::value_type    value_type;
  typedef typename _Iterator::difference_type   difference_type;
  typedef typename _Iterator::pointer     pointer;
  typedef typename _Iterator::reference    reference;
};
“内嵌” 是指定义在类名的定义中,例如iterator_traits 中定义的 iterator_category、value_type 等类型。

“依赖” 是指依赖于一个模板参数。例如 typedef typename _Iterator::value_type value_type 中定义的 value_type依赖模板参数_Iterator。

“类型名” 是指这里要指出是个类型名,而不是变量。

那么 typename 的意义就是告诉 C++ 编译器 ( typedef typename _Iterator::value_type value_type  _Iterator::value_typevalue_type类型而不是该类的一个静态变量。



在 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、付费专栏及课程。

余额充值