我知道在进行了诸如
之类的前瞻声明之后class Foo;
我可以将变量声明为Foo*
或Foo&
,但不能Foo
。
如果我有模板化的类和实例化
template<class T>
class Bar {
public:
T baz;
};
...
Bar<Foo> v;
上述规则将如何适用? Foo必须在定义类Bar
时,或者在声明v
点时完全声明(而不是仅向前声明)?或者它可能只需要在源文件中的任何地方使用Bar<Foo>
,而不是所有其他的?还有别的吗?
由于
答案 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
对象时要分配多少大小。