typename在这种情况下意味着什么

时间:2012-08-10 09:17:27

标签: c++ templates c++11

  

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

我正在阅读this所以我现在正在考虑std::forwardstd::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);
    }

我想我得到了整个故事,但我不理解在模板定义之外使用typenametemplate<...>)。在这种情况下它意味着什么?

1 个答案:

答案 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; ... } 

在你的情况下,这是一回事。