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

dem*_*rge 2 c++ templates c++11

可能重复:
我必须在何处以及为何要使用"template"和"typename"关键字?

我正在读这个,所以我现在正在研究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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*all 7

它表明这identity<_Ty>::type&是一个类型,而不是类中的静态变量.

这是一个更简单的例子:

template<class T> void f() { T::x * p; ... } 
Run Code Online (Sandbox Code Playgroud)

你可以认为这p是一个指向某个类的指针T::x.或者你可以认为这T::x是一个乘以的静态变量p.所以,在这种情况下,编译器无法真正知道这段代码的含义.

要避免这种不明确性,您应该T::x通过添加typename以下内容来指定该类型:

template<class T> void f() { typename T::x * p; ... } 
Run Code Online (Sandbox Code Playgroud)

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