C ++ Typedef签名

时间:2012-01-30 19:30:59

标签: c++ typedef

  

可能重复:
  Where and why do I have to put the “template” and “typename” keywords?

我正在浏览this boost::multi_array example,它有typedef,例如:

template <typename Array>
...
typedef typename Array::template subarray<2>::type::iterator iterator2;

我明白了什么

typedef typename <type> <new_type>;

签名看起来像,但是在typedef typename之后有三件事,我无法在网上找到所谓的或者它的作用。有人可以分解那种typedef的作用以及为什么它有三件事吗?我不认为这是特定的提升。

4 个答案:

答案 0 :(得分:2)

template中的Array::template与您已经了解的typename完全相同。它在typedef中的作用是告诉(保证)编译器subarray实际上是一个模板,因此<2>因此而有意义。

这与typenametypedef关键字的作用完全相同,但是告诉编译器它是template而不是类型。

答案 1 :(得分:1)

这是旧的

typedef typename <type> <new_type>;
你已经明白了。

typetypename Array::template subarray<2>::type::iterator

new_typeiterator2

答案 2 :(得分:1)

无论何时编写模板函数/类,编译器有时需要一些帮助。在此示例中,Array::template是模板化类型中的一种类型,这使得它需要typename

如果没有这个需要,那个typedef就是:

typedef Array::template subarray<2>::type::iterator iterator2;

但是,这会(通常会生成)编译器错误。要修复此错误,只需插入typename关键字。

typedef typename Array::template subarray<2>::type::iterator iterator2;

答案 3 :(得分:0)

在这种情况下,typename是一个帮助程序,让编译器知道这是一个类型。在编译器在依赖类型和限定类型之间进行选择时遇到问题的实例中,该关键字用于模板中。