可能重复:
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的作用以及为什么它有三件事吗?我不认为这是特定的提升。
答案 0 :(得分:2)
template
中的Array::template
与您已经了解的typename
完全相同。它在typedef
中的作用是告诉(保证)编译器subarray
实际上是一个模板,因此<2>
因此而有意义。
这与typename
中typedef
关键字的作用完全相同,但是告诉编译器它是template
而不是类型。
答案 1 :(得分:1)
这是旧的
typedef typename <type> <new_type>;
你已经明白了。
type
是typename Array::template subarray<2>::type::iterator
new_type
是iterator2
答案 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
是一个帮助程序,让编译器知道这是一个类型。在编译器在依赖类型和限定类型之间进行选择时遇到问题的实例中,该关键字用于模板中。