小技巧:解决C4251警告的一种方法

小技巧:解决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版本等。

标签:

评论已关闭。