STL代码typedef typename value_type,size_type等这些如何工作?

时间:2014-01-14 06:16:00

标签: c++ templates stl typedef

在某些STL类中,您可以找到这样的代码(取自矢量标题):

        // TEMPLATE CLASS _Vector_val
template<class _Val_types>
    class _Vector_val
        : public _Container_base
    {   // base class for vector to hold data
public:
    typedef _Vector_val<_Val_types> _Myt;
    typedef typename _Val_types::value_type value_type;
    typedef typename _Val_types::size_type size_type;
    typedef typename _Val_types::difference_type difference_type;
    typedef typename _Val_types::pointer pointer;
    typedef typename _Val_types::const_pointer const_pointer;
    typedef typename _Val_types::reference reference;
    typedef typename _Val_types::const_reference const_reference;

    typedef _Vector_iterator<_Myt> iterator;
    typedef _Vector_const_iterator<_Myt> const_iterator;

    _Vector_val()
        {   // initialize values
        _Myfirst = pointer();
        _Mylast = pointer();
        _Myend = pointer();
        }

    pointer _Myfirst;   // pointer to beginning of array
    pointer _Mylast;    // pointer to current end of sequence
    pointer _Myend; // pointer to end of array
    };

我不明白(并且不知道如何有效地进行谷歌搜索)这些代码行是如何运作的以及它们正在做什么:

typedef typename _Val_types::value_type value_type;

例如,为什么value_type显然位于_Val_types的命名空间内?

另外,为什么看起来这里有一个函数调用?: _Myfirst = pointer();

希望有人可以解释这是如何运作的,或者将我引导到一些解释它的相关网站。

非常感谢!

1 个答案:

答案 0 :(得分:3)

_Val_types不是名称空间名称,它是实例化的class _Vector_val类型。不允许使用命名空间名称作为模板参数。

typedef typename _Val_types::value_type value_type;

在上面一行中,您创建了一个名为value_type的类型,它是嵌套类型的别名,也是value_type类型中定义的_Val_typestypename关键字的原因是,当您引用依赖类型时,它是必需的(value_type取决于_Val_types的类型),请参阅this comprehensive answer其他细节。

_Myfirst = pointer();

上述行默认构建pointer并将该值分配给_Myfirst。如果pointer是一个微不足道的类型,让我们说_Val_typesint_Val_type::pointer被定义为int *,那么上面的表达式将值初始化{{ 1}},表示零初始化它,零可以转换为int *。简而言之,它将nullptr数据成员设置为_Myfirst