2

重複の可能性:
「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);
    }

全体像はわかったと思いますがtypename、テンプレート定義の外側の使い方がわかりません(template<...>)。この場合はどういう意味ですか?

4

1 に答える 1

7

これは、identity<_Ty>::type&であり、クラスの静的変数ではないことを示しています。

より簡単な例を次に示します。

template<class T> void f() { T::x * p; ... } 

pあなたはそれがクラスの何かへのポインタであると考えることができますT::xT::xまたは、それが。で乗算される静的変数であると考えることができますp。したがって、この場合、コンパイラは、このコードが何を意味するのかを実際に知ることはできません。

このようなあいまいさを避けるために、次をT::x追加してタイプを指定する必要がありますtypename

template<class T> void f() { typename T::x * p; ... } 

あなたの場合も同じです。

于 2012-08-10T09:22:21.743 に答える