键入别名和自引用

时间:2017-04-28 21:38:16

标签: c++ self-reference type-alias

例如,单链接列表节点可能定义如下

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

假设我们只有一个整数列表。允许此类具有指向其自己类型的成员,因为指针都具有相同的大小,而不管底层数据结构的大小。

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

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

我知道这似乎是一个愚蠢的例子,但我想知道为什么这不会编译的原因。我实际上有类似的情况,它可能是有用的(不是与std :: pair)。另外,假设这两个代码段来自不同的程序,即我没有节点自定义类以及在同一程序中作为节点别名的一对。

2 个答案:

答案 0 :(得分:3)

当引用type alias declarations at cppreference的规范时,type-id不能直接或间接引用引入的名称:

  

使用标识符attr(可选)= type-id;   identifier - 此声明引入的名称,该名称将成为类型名称   template-parameter-list - 模板参数列表,与模板一样   声明type-id - 抽象声明符或任何其他有效的type-id   (可能会引入一种新类型,如type-id中所述)。 类型ID   不能直接或间接引用标识符。注意点   标识符的声明是在分号后面   型-ID。

关于命名空间,请注意node中的std::pair<node *, int>未引用命名空间node的{​​{1}},因此仍然是未定义的类型名称。

答案 1 :(得分:2)

请注意type-alias

  

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

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