gpt4 book ai didi

c++ - C++ 中 "typedef"有什么特殊含义吗?

转载 作者:行者123 更新时间:2023-11-28 02:07:38 26 4
gpt4 key购买 nike

当我阅读 stdc++ 代码时,我对以下几行感到困惑。这是 STL_list.h 中的一段代码。

template <class _Tp, class _Alloc>                                      
class _List_base
: public _List_alloc_base<_Tp, _Alloc,
_Alloc_traits<_Tp, _Alloc>::_S_instanceless>
{
public:
typedef _List_alloc_base<_Tp, _Alloc,
_Alloc_traits<_Tp, _Alloc>::_S_instanceless>
_Base; /* Is _Base a kind of type?*/
typedef typename _Base::allocator_type allocator_type;

_List_base(const allocator_type& __a) : _Base(__a) {/* How can a type be initiated like this?*/
_M_node = _M_get_node();
_M_node->_M_next = _M_node;
_M_node->_M_prev = _M_node;
}
}

让我困惑的是_Base。此名称由 typedef 定义。我认为这是一种类型。但是 _Base 出现在初始化列表中。我如何理解这种用法​​?或者,请为我粘贴一些有用的链接。

最佳答案

A typedef声明类型的别名 - 如果您愿意,可以使用速记。

它的语法就像你声明一个变量一样,但它不是一个变量,而是为指定类型创建一个别名:

int a;         // a is a variable of type int
typedef int B; // B is an alias for type int

(请注意他们经常说 typedef original-type alias ,但这是一条不正确的规则 - 例如,如果函数指针失败 - 并且无缘无故地记住了一条规则)

对于静态成员,类型别名是作用域 - 在类内部不需要其他限定符就可以访问它,从外部它需要限定(_List_base::_Base)。


针对您的具体情况,它只是引用基类的简写,即 _List_alloc_base<_Tp, _Alloc, _Alloc_traits<_Tp, _Alloc>::_S_instanceless>每次都写完整肯定很麻烦。

它出现在初始化列表中是因为构造函数正在调用基类的构造函数 - 即 _Base - 传递参数 __a .

如果您能以某种方式“扩大”typedef 的范围,这可能更容易查看并写下:

template <class _Tp, class _Alloc>                                      
class _List_base
: public _Base
{
public:
typedef _List_alloc_base<_Tp, _Alloc,
_Alloc_traits<_Tp, _Alloc>::_S_instanceless>
_Base;
typedef typename _Base::allocator_type allocator_type;

_List_base(const allocator_type& __a) : _Base(__a) {

关于c++ - C++ 中 "typedef"有什么特殊含义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36892014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com