我有以下情况:
header.h:
class A
{
public:
class B; // incomplete type
private:
// is never used outside of source file for A
std::vector<B> vector_of_bs; // template
}
source1.cpp:
class A::B {}; // defined here
直到这里一切都很好。现在如果我想在其他地方使用class A
,它就不起作用了:
source2.cpp
:使用A类,不用
在VS2010中vector(721):错误C2036:'A :: B *':未知大小
编译类模板成员函数'std :: vector&lt; _Ty&gt; &amp; std :: vector&lt; _Ty&gt; :: operator =(const std :: vector&lt; _Ty&gt;&amp;)'
。如何链接source1.o中的std :: vector的模板特化?
我还需要在declspec(_dllimport)
...
答案 0 :(得分:1)
标准库容器cannot be instantiated with incomplete types。这样做是未定义的行为,在您的情况下会产生明显的错误。其他实现会默默地接受您的代码。
要解决此问题,boost会提供counterparts for the standard library containers that can in fact be instantiated with incomplete types。您可以使用boost对应替换std::vector
来修复代码:
#include <boost/container/vector.hpp>
class A
{
public:
class B; // incomplete type
private:
boost::vector<B> vector_of_bs;
};