此模板化代码如何编译
How does this templated code compile?
我正在努力理解它是如何编译的:
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.