小技巧:解决C4251警告的一种方法
作者:BlogUpdater |
时间:2017-08-29 |
浏览:7299 |
评论已关闭 条评论
问题:
考虑如下的类:
class MYCLASS_API CMyClass
{
private:
std::string m_data;
};
该类为导出类,包含一个STL成员,如果直接导出,则VS2010会发出C4251的警告,例如:
warning C4251: ‘XXX’ : class ‘XXX’ needs to have dll-interface to be used by clients of class ‘XXX’
解决方法:
在该类定义之前,将std::string显式导出:
template class MYCLASS_API std::allocator;
template class MYCLASS_API std::basic_string;
原理:
当我们标记一个类为导出的时候,类的客户将会取得这个类的访问权限。当这个类中定义了模板类成员,也必须标记为导出才能被客户访问到。所以,当STL成员未标记为导出时,就会出现如上的警告。
另外需要注意的是:模板类是在编译期间实例化的,那么客户在使用带有模板类成员的类时,必须和编译这个类所使用的编译选项一致,包括STL版本,Runtime版本等。
如需转载,请注明来自:拓扑梅尔智慧办公平台 | TopomelBox 官方站点
- 下一篇: 小技巧:解决C4996警告的一种方法
- 上一篇: 脚本学习:grep-在一堆文件中查找指定的文本
相关推荐
- VS2019中C++20的协程实现
- Posted on 09月02日
- 第 1005 期:微软即将移除 Edge 浏览器中的文件共享工具 Edge Drop
- Posted on 08月29日
- 第 701 期:微软承认 Teams 用户界面太拥挤并表示将修复此问题
- Posted on 05月23日
- 第 1001 期:微软发布适用于 Windows 11 操作系统的 KB5120998 更新
- Posted on 08月28日



评论已关闭。