这个模板化代码是如何编译的?

时间:2017-04-05 23:48:50

标签: c++ templates

我很难理解这是如何编译的:

template <class T, class U>
struct A { ... };

struct B {
  template <class T>
  using C = A<T, B>;
  ...
};

如何在'B'的定义中将'B'作为模板参数传递给'A' - 也就是说,'B'尚未完全定义......

非常感谢任何帮助,

干杯

1 个答案:

答案 0 :(得分:3)

在您关注的行中,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是一个不完整的类型。编译器无法创建vector foo,因为它不知道foo的大小,或者因此需要分配多少内存。但是给类型一个完整的定义并且它有效:

#include <vector>

struct foo;
using foovector = std::vector<foo>; // Legal.

struct foo {
  foo *p;
};

foovector v(4); // Now this works.