VC 编程中疑难错误解决方法之 C4251
代码: Warning C4251 描述: class“Class Name”需要有 dll 接口 原因和解决方法: a) 如果该类(Class Name)的定义里面仅含有编译器内置的类型变量,如 int、 float 等等,或者成员函数仅使用了这些变量作为参数,那么只需 要直接导出该类即可。
class _declspec(dllexport) YourClass { }
b) 如果该类(Class Name)的内部使用了其他类(Other Class) ,那么这个 类(Other Class)最好也导出,不然,首先编译的时候会出现编译警告: (warning C4251: needs to have dll-interface )
class __declspec(dllexport) YourClass { YourAnatherClass m_data; // 这里会出现warning 4251. 如果YourAnatherClass 没有导出的话. }
解决办法: 在 YourAnatherClass 定义的地方加上
class __declspec(dllexport) YourAnatherClass { }
当你的 YourAnatherClass 没有导出的时候,dll 的使用方会出现链接错误。 c) 当类的内部使用了 STL 模板的时候,也会出现 C4251 警告, 情况会有所 不同
class __declspec(dllexport) YourClass { vector
m_data; // 这里会出现warning 4251. 因为vector类型没有被 导出
}
上面所使用的模板代码(无论是 STL 模板或自定义模板),编译 dll 时会出 现 C4251 警告,但是 dll 的使用方,却不会出现链接错误!这个因为,dll 的使用 方那里也有一套模板的定义,当他们使用那个 vector的时候,虽没有导出, 但是用户自己也有一套 STL 模板(或者是自定义的模板) ,用户会利用自己的模 板实例化这个 dll 中没有导出的东西! 所以,对于因为使用 STL(或模板)出现的 C4251 警告,关闭之即可:
#pragma warning(disable:4251)
若想不使用通过关闭警告的方式关闭警告,那么将类导出即可。 1) 对于用户自定义的模板
template class DLLImportExportMacro SomeTemplate; SomeTemplate y;
2)对于 STL 的模板
template class DLLImportExportMacro std::allocator template class DLLImportExportMacro std::vectorxml:namespace prefix = int,std />>; vector m_data;