此模板化代码如何编译

How does this templated code compile?

本文关键字:编译 何编译 代码      更新时间:2023-10-16

我正在努力理解它是如何编译的:

template <class T, class U>
struct A { ... };
struct B {
  template <class T>
  using C = A<T, B>;
  ...
};
如何在"B"的定义中将"B">

作为模板参数传递给"A"——也就是说,"B"尚未完全定义......

任何帮助将不胜感激,

干杯

在你关注的行中,B被声明为"不完整类型"。 下面是一个更简单的示例:

struct foo {
  foo *p;
};

您还可以使用语句(如 struct foo; (声明不完整的类型。 这不会为编译器提供足够的信息来让你在另一个结构中创建foo或存储foo,但它确实允许你在知道foo是类型名称就足够了的上下文中使用该名称。 举个例子:

#include <vector>
struct foo;
using foovector = std::vector<foo>; // Legal.
// foovector v(4); // Invalid.

如果您取消注释最后一行并尝试编译,您将收到一堆错误消息,指出foo是一个不完整的类型。 编译器无法创建foo vector,因为它不知道foo的大小,也不知道要分配多少内存。 但是给类型一个完整的定义,它就可以了:

#include <vector>
struct foo;
using foovector = std::vector<foo>; // Legal.
struct foo {
  foo *p;
};
foovector v(4); // Now this works.