可能重复:
Where and why do I have to put the “template” and “typename” keywords?
我正在阅读this所以我现在正在考虑std::forward
和std::move
的实施:
// TEMPLATE FUNCTION forward
template<class _Ty> inline
_Ty&& forward(typename identity<_Ty>::type& _Arg)
{ // forward _Arg, given explicitly specified type parameter
return ((_Ty&&)_Arg);
}
// TEMPLATE FUNCTION move
template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&&
move(_Ty&& _Arg)
{ // forward _Arg as movable
return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
}
我想我得到了整个故事,但我不理解在模板定义之外使用typename
(template<...>
)。在这种情况下它意味着什么?
答案 0 :(得分:7)
它表示identity<_Ty>::type&
是类型,而不是类中的静态变量。
这是一个更简单的例子:
template<class T> void f() { T::x * p; ... }
您可以认为p
是指向某个类T::x
的指针。
或者您可以认为T::x
是一个乘以p
的静态变量。
所以,在这种情况下,编译器无法真正知道这段代码的含义。
为避免此类含糊不清,您应通过添加T::x
来指定typename
是一种类型:
template<class T> void f() { typename T::x * p; ... }
在你的情况下,这是一回事。