2

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

我正在阅读这篇文章,所以我现在正在研究std::forwardand的实现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<...>)。在这种情况下是什么意思?

4

1 回答 1

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

在你的情况下,情况是一样的。

于 2012-08-10T09:22:21.743 回答