定义矢量类型时向前声明错误?(Forward declaration error when defi

2019-09-19 00:23发布

我试图使用前向声明为尽我所能,以尽量减少编译时间。 我注意到,当我向前声明中使用类似的std ::向量作为一个成员对象(例如这里)类:

class myTypeA
class A
{
  A(){};
  ~A(){};
  std::vector<myTypeA > getTypeA();

}

我得到以下错误:

microsoft visual studio 9.0\vc\include\vector(1112) : error C2036: 'myTypeA *' : unknown size
1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(1102) : while compiling class template member function 'bool std::vector<_Ty>::_Buy(unsigned int)'
1>        with
1>        [
1>            _Ty=myTypeA
1>        ]
1>        d:\cpp\A.h(15) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1>        with
1>        [
1>            _Ty=myTypeA
1>        ]

当我使用的#include“myTypeA.h”这是工作的罚款,为什么呢?

Answer 1:

这是因为编译器需要知道被存储在矢量类型的大小。 如果没有完整的类定义它有没有知道这一点的方式。

另一种方法是,以存储指向您的前瞻性声明的类型 - 不过你需要管理的内存分配和释放。

第三个选择是申报shared_ptr根据您的向前声明类型的类型和这些存储在您的载体。



Answer 2:

由于错误说

error C2036: 'myTypeA *' : unknown size

编译器不知道这种类型的前向申明的对象的大小。 它只是告诉是什么类型的。 您需要包括头类定义带来让编译器可以评估这个类型的对象的大小。

看到这个SO问题



Answer 3:

简单的答案是,标准需要一个完整的定义,任何时候你实例化一个以上类型的模板; 这是不确定的行为,否则。 其中执行这样的约束的编译器(克++,当与适当的选项编译)将无法编译器。 其他人可能会接受它。 (虽然形式上不确定的行为,在实践中,它要么无法编译,或者达到预期效果。)

我有些诧异,微软编译失败的您发布的代码位,因为它并不需要知道什么myTypeA 。 该消息看起来就像如果你调用的函数可能出现的东西; 如果调用功能,你一定会需要的定义myTypeA ,因为编译器将实例化拷贝构造函数,这反过来又意味着复制的实例包含myTypeA



文章来源: Forward declaration error when defining a vector type?