类型的混叠和自我引用

Type aliasing and self-referencing

本文关键字:自我 引用 类型      更新时间:2023-10-16

作为一个例子,可以将单连锁的列表节点定义如下

namespace example_part1
{
    class node
    {
        node * next;
        int value;
    }
}

假设我们只有一个整数列表。该类可以具有指向自己类型的成员,因为指针的大小都相同,无论基础数据结构的大小如何。

现在,为什么我不允许这样做

namespace example_part2
{
    using node = std::pair<example_part2::node *, int>;
}

我知道这似乎是一个愚蠢的例子,但是我想更多地了解为什么不编译的原因。实际上,我的情况可能很有用(不使用STD :: PAIP(。另外,假设这两个代码段来自不同的程序,即我没有一个节点自定义类,也没有一个将其作为一个节点的对组中的一个节点。

请注意,在type-alias

[type-id是]抽象声明器或任何其他有效的类型ID(可能引入一个 新类型,如类型ID中所述(。ID类型不能直接或 间接参考标识符。

本质上,别名可能不是递归的。

在参考cppReference在cppReference上的类型别名声明的规范时,ID不得直接或间接地参考引入的名称:

使用标识符attr(可选(= type-id; 标识符 - 该声明引入的名称,该名称成为类型名称 模板参数列表 - 模板参数列表,如模板中 声明类型ID-抽象声明器或任何其他有效的类型ID (如类型ID中所述,可能会引入一种新类型(。 type-id 不能直接或间接地指标识符。请注意这一点 标识符的声明是在Semicolon下面 type-id。

关于命名空间,请注意,std::pair<node *, int>中的node不参考名称空间example_part1node,因此仍然是未定义的类型名称。