在DLL接口中导出包含相同类的STL类成员

时间:2015-07-10 06:23:53

标签: c++ stl

假设我有一个在STL容器中引用自身的类:

class __declspec(dllexport) Widget {
protected:
    std::vector<Widget *> children;
}

如果我说vector代替int,那么在课程定义之前我可以有以下内容:

template class __declspec(dllexport) std::vector<int>;

据说可行。但是如果没有定义类,我该怎么做呢?转发声明课程:

class Widget;
template class __declspec(dllexport) std::vector<Widget *>;

没有摆脱我从MSVC获得的警告;

warning C4251: 'Widget::children' : class 'std::vector<Widget *,std::allocator<_Ty>>' needs to have dll-interface to be used by clients of class 'Widget'

我相信警告本身的信息在某种程度上是相关的,但我不确定如何继续。

2 个答案:

答案 0 :(得分:3)

取自here,这些错误的家族基本上是噪音;

  

C4251基本上是噪音,可以沉默    - Stephan T. Lavavej(Micrsoft C ++库的维护者之一)。

只要编译器选项在整个项目中保持一致,只需将此警告静音即可。

作为更全面的替代方案,您可以查看pimpl pattern并从类定义中删除std::vector,因此无需从dll导出。

class __declspec(dllexport) Widget {
protected:
    struct Pimpl;
    Pimpl* pimpl_;
}

// in the cpp compiled into the dll
struct Widget::Pimpl {
    // ...
    std::vector<Widget*> children;
    // ...
}

MSDN has a nice article on this作为新C ++ 11功能介绍的一部分。

通常,在dll interface中不使用std类更容易,尤其是在需要互操作性的情况下。

答案 1 :(得分:0)

警告本身确实很重要。它中提到的头文件安装在与我正在处理的目录不同的目录中,因此没有看到我的更改。修复警告的正确方法是:

class Widget;
template class __declspec(dllexport) std::vector<Widget *>;

在课程定义之前。