作为一个例子,可以将单连锁的列表节点定义如下
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_part1
的node
,因此仍然是未定义的类型名称。