我很难理解这是如何编译的:
template <class T, class U>
struct A { ... };
struct B {
template <class T>
using C = A<T, B>;
...
};
如何在'B'的定义中将'B'作为模板参数传递给'A' - 也就是说,'B'尚未完全定义......
非常感谢任何帮助,
干杯
答案 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.