c++ - typename 在这种情况下是什么意思

标签 c++ templates c++11

<分区>

Possible Duplicate:
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<...> )。在这种情况下,这意味着什么?

最佳答案

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

你的情况是一样的。

关于c++ - typename 在这种情况下是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898679/

相关文章:

c++ - 多次迭代后的 BadPtr

c++ - 从文件名变量中删除 ".txt"

c++ - 可调用对象作为默认模板参数

c++ - std::chrono 的频率?

c++ - 如何在 Linux 中运行 visual studio 2015 managed c++ 测试函数?

c++ - 如何在一个类中实例化Map?

c++ - 析构函数的模板特化

c++ - 混合 typedef 和 CRTP?

c++ - 在 C++ 中处理来自基类的重写方法的异常

c++ - 什么时候私有(private)构造函数不是私有(private)构造函数?