假设我有一个在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'
我相信警告本身的信息在某种程度上是相关的,但我不确定如何继续。
答案 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 *>;
在课程定义之前。