C++ 使用类作为具有正向声明的模板化类的模板参数
我知道在转发声明后C++ 使用类作为具有正向声明的模板化类的模板参数,c++,templates,C++,Templates,我知道在转发声明后 class Foo; 我可以将变量声明为Foo*或Foo&,但不能声明为Foo 如果我有一个模板类和实例化 template<class T> class Bar { public: T baz; }; ... Bar<Foo> v; 模板 分类栏{ 公众: T-baz; }; ... 第五栏; 上述规则如何适用?是否必须在定义类Bar的点或在声明v的点完全声明Foo(而不是仅向前声明)?或者只需要在源文件中的某个位置使用Bar,而其
class Foo;
我可以将变量声明为Foo*
或Foo&
,但不能声明为Foo
如果我有一个模板类和实例化
template<class T>
class Bar {
public:
T baz;
};
...
Bar<Foo> v;
模板
分类栏{
公众:
T-baz;
};
...
第五栏;
上述规则如何适用?是否必须在定义类Bar
的点或在声明v
的点完全声明Foo(而不是仅向前声明)?或者只需要在源文件中的某个位置使用Bar
,而其他所有位置都不使用?还有别的吗
谢谢Bar
需要完整的Foo
定义,因为它包含类型为Foo
的数据成员。在这种情况下,您无法转发声明。在这方面,Bar
相当于
class BarFoo
{
public:
Foo baz;
};
要回答您的问题,您只需在心里用模板参数类型替换
T
:
template<class T>
class Bar {
public:
T baz;
};
现在,正如您所知,编译器需要完整声明
Foo
,以便知道在声明Bar
对象时要分配多少大小。但是在哪里需要它呢?仅在条形图
使用时,或在条形图
的定义时追溯?@baruch仅当您实例化类型条形图
时。类模板Bar
对Foo
一无所知。否则模板将无法工作。是的,但问题是在哪里进行替换,因此必须知道Foo
的完全减速:在第一次实例化时,在每个模板上,或者追溯到Bar
定义?@baruch,当您使用Bar
时。
class Bar {
public:
Foo baz;
};