Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用类作为具有正向声明的模板化类的模板参数_C++_Templates - Fatal编程技术网

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;
};