使用模板类作为模板参数

时间:2016-06-20 15:30:40

标签: c++ template-meta-programming

请考虑以下代码:

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>中用作完整类型?

4 个答案:

答案 0 :(得分:3)

template声明的范围内,模板的名称仅为每个自动生成的特化指定一个完整类型,与该特化同义。考虑一下,例如,

template<class A> struct B {
    B();
    B &operator=(B const &);
    typedef B This;
};

答案 1 :(得分:2)

当有人使用B的特定模板实例时,

B 成为一个完整的类型。

请记住,模板代码不是&#34;编译&#34;直到创建实例。

答案 2 :(得分:2)

在类模板X的实例化中,名称X可用于引用模板或模板的当前实例化。

来自[temp.local]

  

1 - 与普通(非模板)类一样,类模板有注入类名(第9条)。 注入类名   可以用作模板名称类型名称

答案 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在其定义中的定义。