在某些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();
希望有人可以解释这是如何运作的,或者将我引导到一些解释它的相关网站。
非常感谢!
答案 0 :(得分:3)
_Val_types
不是名称空间名称,它是实例化的class _Vector_val
类型。不允许使用命名空间名称作为模板参数。
typedef typename _Val_types::value_type value_type;
在上面一行中,您创建了一个名为value_type
的类型,它是嵌套类型的别名,也是value_type
类型中定义的_Val_types
。 typename
关键字的原因是,当您引用依赖类型时,它是必需的(value_type
取决于_Val_types
的类型),请参阅this comprehensive answer其他细节。
_Myfirst = pointer();
上述行默认构建pointer
并将该值分配给_Myfirst
。如果pointer
是一个微不足道的类型,让我们说_Val_types
是int
而_Val_type::pointer
被定义为int *
,那么上面的表达式将值初始化{{ 1}},表示零初始化它,零可以转换为int *
。简而言之,它将nullptr
数据成员设置为_Myfirst
。