C++ “是否有特殊含义?”;typedef";在C++;?

C++ “是否有特殊含义?”;typedef";在C++;?,c++,typedef,C++,Typedef,当我阅读stdc++代码时,我对下面几行感到困惑。 下面是来自stl_list.h的一段代码 template <class _Tp, class _Alloc> class _List_base : public _List_alloc_base<_Tp, _Alloc,

当我阅读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;                                         
  }
}                                                              
模板
类_列表_基
:public\u List\u alloc\u base
{                                                                       
公众:
类型定义列表分配基数
_Base;/*Base是一种类型吗?*/
typedef typename _Base::分配器_type分配器_type;
_List_base(const allocator_type&u a):_base(u a){/*如何像这样初始化类型?*/
_M_node=_M_get_node();
_M_node->M_next=\U M_node;
_M_node->M_prev=_M_node;
}
}                                                              
让我困惑的是
\u Base
。此名称由
typedef
定义。我认为这是一种类型。但初始化列表中会出现
\u Base

我如何理解这个用法?或者请为我粘贴一些有用的链接。

它用于根据以前存在的类型定义自定义类型。为您可能说的类型提供别名
typedef
可以理解为“定义类型”或“
type
-
def
inition”

您可以使用“链接的”
typdef
s,即:

typedef int Id;     // Define new type "Id"
typedef Id UserId;  // Define new type "UserId" based on a previously existing type
// This is possible since "Id" was already defined
然后使用它:

UserId uid = 0; //uid is a variable of type UserId, which is an alias for int
在您每次使用
\u Base
时提供的示例中,您使用的是发动机罩下的
\u List\u alloc\u Base
,但使用的方式较短。使用该别名会产生更干净、更紧凑的代码块

您可能会注意到,该示例还在以下行中使用了
typedef typename

typedef typename _Base::allocator_type allocator_type;
请注意,
\u Base
可以在该行中使用,因为它已在前一行中定义。有关组合使用
typedef
typename
的说明,请参阅,也请阅读


发件人:

下面的公式是:

typedef[attributes]数据类型别名

typedef
关键字是必需的。该属性不可用。 “代码> TyPulf< /Cord>关键字,可以遵循任何C++内置的数据类型,包括“代码> int < /C>”、“代码>短符号、<代码>未签名< /代码>、<代码> char 、<代码>签名CHAR> <代码>、<代码>未签名CHAR< <代码>、<代码>双、<代码>长< /C> >或<代码>长双。数据类型也可以是由C++编译器中的一个库提供的现有类。例如,它可以是string类。数据类型也可以是指向已知类型的指针


即使这是一个定义,你会遇到很多次这个关键字,它可能更容易被认为是
typedef声明,正如Matteo Italia在下面的评论中指出的。

它用于根据以前存在的类型定义自定义类型。为您可能说的类型提供别名
typedef
可以理解为“定义类型”或“
type
-
def
inition”

您可以使用“链接的”
typdef
s,即:

typedef int Id;     // Define new type "Id"
typedef Id UserId;  // Define new type "UserId" based on a previously existing type
// This is possible since "Id" was already defined
然后使用它:

UserId uid = 0; //uid is a variable of type UserId, which is an alias for int
在您每次使用
\u Base
时提供的示例中,您使用的是发动机罩下的
\u List\u alloc\u Base
,但使用的方式较短。使用该别名会产生更干净、更紧凑的代码块

您可能会注意到,该示例还在以下行中使用了
typedef typename

typedef typename _Base::allocator_type allocator_type;
请注意,
\u Base
可以在该行中使用,因为它已在前一行中定义。有关组合使用
typedef
typename
的说明,请参阅,也请阅读


发件人:

下面的公式是:

typedef[attributes]数据类型别名

typedef
关键字是必需的。该属性不可用。 “代码> TyPulf< /Cord>关键字,可以遵循任何C++内置的数据类型,包括“代码> int < /C>”、“代码>短符号、<代码>未签名< /代码>、<代码> char 、<代码>签名CHAR> <代码>、<代码>未签名CHAR< <代码>、<代码>双、<代码>长< /C> >或<代码>长双。数据类型也可以是由C++编译器中的一个库提供的现有类。例如,它可以是string类。数据类型也可以是指向已知类型的指针


即使这是一个定义,你会遇到很多次这个关键字,它可能更容易被认为是
typedef声明
正如Matteo Italia在下面的评论中指出的那样。

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
,但这是一条不正确的规则,例如,如果函数指针失败,那么这是一条不需要记住的规则)

对于静态成员,类型别名的作用域是有限的——在类内部,它不需要其他限定符就可以访问,从外部,它需要限定(
\u List\u base::\u base


谈到您的具体情况,它只是一个基类的简写,基类是
\u List\u alloc\u base
,每次完全编写肯定会很麻烦

它出现在初始化列表中,因为构造函数正在调用基类的构造函数-即
\u base
-传递参数
\u a

如果您愿意,这可能更容易看到