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

C++ 这个模板化代码是如何编译的?,c++,templates,C++,Templates,我很难理解它是如何编译的: template <class T, class U> struct A { ... }; struct B { template <class T> using C = A<T, B>; ... }; 模板 结构A{…}; 结构B{ 模板 使用C=A; ... }; 如何将“B”作为模板参数传递给“B”定义中的“a”-也就是说,“B”尚未完全定义 任何帮助都将不胜感激 干杯在您关心的那行,B被声明为“不完整类型”

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

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

struct B {
  template <class T>
  using C = A<T, B>;
  ...
};
模板
结构A{…};
结构B{
模板
使用C=A;
...
};
如何将“B”作为模板参数传递给“B”定义中的“a”-也就是说,“B”尚未完全定义

任何帮助都将不胜感激


干杯

在您关心的那行,
B
被声明为“不完整类型”。下面是一个简单的示例:

struct foo {
  foo *p;
};
您还可以使用
structfoo。这并不能为编译器提供足够的信息,使您能够创建
foo
或在另一个结构中存储
foo
,但它确实允许您在知道
foo
是类型名称的上下文中使用名称。例如:

#include <vector>

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

在您关心的行中,
B
被声明为“不完整类型”。下面是一个简单的示例:

struct foo {
  foo *p;
};
您还可以使用
structfoo。这并不能为编译器提供足够的信息,使您能够创建
foo
或在另一个结构中存储
foo
,但它确实允许您在知道
foo
是类型名称的上下文中使用名称。例如:

#include <vector>

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

它是C++所明确允许的。B不需要完全定义,除非它在
A
中用作值类型。不要发布无法编译的代码,然后告诉我们它已编译。在这些情况下,请提供一个。将省略号替换为
/**/并且你有一个MCVE或一些琐碎的东西。它是C++允许的。B不需要完全定义,除非它在
A
中用作值类型。不要发布无法编译的代码,然后告诉我们它已编译。在这些情况下,请提供一个。将省略号替换为
/**/并且你有一个MCVE或者一些非常接近的东西。