使用类作为带有前向声明的模板化类的模板参数

时间:2014-01-08 22:03:00

标签: c++ templates

我知道在进行了诸如

之类的前瞻声明之后
class Foo;

我可以将变量声明为Foo*Foo&,但不能Foo

如果我有模板化的类和实例化

template<class T>
class Bar {
  public:
    T baz;
};
...
Bar<Foo> v;

上述规则将如何适用? Foo必须在定义类Bar时,或者在声明v点时完全声明(而不是仅向前声明)?或者它可能只需要在源文件中的任何地方使用Bar<Foo>,而不是所有其他的?还有别的吗?

由于

2 个答案:

答案 0 :(得分:5)

Bar<Foo>需要完整的Foo定义,因为它包含Foo类型的数据成员。在这种情况下你无法转发声明。在这方面,Bar<Foo>相当于

class BarFoo 
{  
 public:
    Foo baz;
};

答案 1 :(得分:0)

要回答您的问题,您只需要在心理上用模板参数类型替换T

template<class T>
class Bar {
public:
    T baz;
};

使用此方法,上面的代码将更改为:

class Bar {
public:
    Foo baz;
};

现在,正如您所知,编译器需要Foo的完整声明才能知道在声明Bar对象时要分配多少大小。