请考虑以下代码:
template <class MyB>
struct A {
MyB *b_;
};
template <template <class> class MyA>
struct B {
MyA<B> *a_; // How come B can be used as a complete type here?
};
评论说明我的问题:B
是一个模板,那么为什么它可以在MyA<B>
中用作完整类型?
答案 0 :(得分:3)
在template
声明的范围内,模板的名称仅为每个自动生成的特化指定一个完整类型,与该特化同义。考虑一下,例如,
template<class A> struct B {
B();
B &operator=(B const &);
typedef B This;
};
答案 1 :(得分:2)
B
的特定模板实例时, B
将成为一个完整的类型。
请记住,模板代码不是&#34;编译&#34;直到创建实例。
答案 2 :(得分:2)
答案 3 :(得分:0)
为什么B可以在这里用作完整类型?
B
不一定是完整的时间来声明MyA<B>
类型的指针。
您可以使用:
template <typename T> struct Foo { T* ptr;};
struct Bar;
Foo<Bar>* ptr = nullptr;
您甚至可以使用:
template <typename T> struct Foo { T* ptr;};
struct Bar;
Foo<Bar> obj;
因为Foo
不依赖于Bar
在其定义中的定义。