C ++导出模板实现不完整类型

时间:2015-02-09 11:50:48

标签: c++ templates forward-declaration

我有以下情况:

  

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类,不用

编译
  

vector(721):错误C2036:'A :: B *':未知大小

     

编译类模板成员函数'std :: vector&lt; _Ty&gt; &amp; std :: vector&lt; _Ty&gt; :: operator =(const std :: vector&lt; _Ty&gt;&amp;)'

在VS2010中

。如何链接source1.o中的std :: vector的模板特化?

我还需要在declspec(_dllimport) ...

中使用它

1 个答案:

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