Ogre 如何在没有 C4251 警告的情况下在导出的 class 中使用 STL 容器?
How Ogre uses STL containers in an exported class without C4251 warning?
OgrePrerequisites.h
#define _OgreExport __declspec( dllexport )
template <typename K, typename V, typename P = std::less<K>, typename A = STLAllocator<std::pair<const K, V>, GeneralAllocPolicy> >
struct map
{
typedef typename std::map<K, V, P, A> type;
typedef typename std::map<K, V, P, A>::iterator iterator;
typedef typename std::map<K, V, P, A>::const_iterator const_iterator;
}
OgreLogManager.h
class _OgreExport LogManager
{
protected:
typedef map<String, Log*>::type LogList;
/// A list of all the logs the manager can access
LogList mLogs;
};
LogManager
使用 std::map
,但是当我构建项目时,我没有收到任何 C4251 警告:
**class 'std::map<_Kty,_Ty>' needs to have dll-interface to be used by clients of class**
我想知道Ogre如何消除C4251
警告?
他们明确地disable certain warnings with #pragma warning。如 MSDN 所述,通常的方法是结合
在本地禁用警告
#pragma warning( push )
#pragma warning( disable : 4705 )
// Some code
#pragma warning( pop )
恢复原来的警告设置。他们恢复了 OgreHeaderSuffix.h 中的警告设置,因此这些警告仅对库代码禁用。
OgrePrerequisites.h
#define _OgreExport __declspec( dllexport )
template <typename K, typename V, typename P = std::less<K>, typename A = STLAllocator<std::pair<const K, V>, GeneralAllocPolicy> >
struct map
{
typedef typename std::map<K, V, P, A> type;
typedef typename std::map<K, V, P, A>::iterator iterator;
typedef typename std::map<K, V, P, A>::const_iterator const_iterator;
}
OgreLogManager.h
class _OgreExport LogManager
{
protected:
typedef map<String, Log*>::type LogList;
/// A list of all the logs the manager can access
LogList mLogs;
};
LogManager
使用 std::map
,但是当我构建项目时,我没有收到任何 C4251 警告:
**class 'std::map<_Kty,_Ty>' needs to have dll-interface to be used by clients of class**
我想知道Ogre如何消除C4251
警告?
他们明确地disable certain warnings with #pragma warning。如 MSDN 所述,通常的方法是结合
在本地禁用警告#pragma warning( push )
#pragma warning( disable : 4705 )
// Some code
#pragma warning( pop )
恢复原来的警告设置。他们恢复了 OgreHeaderSuffix.h 中的警告设置,因此这些警告仅对库代码禁用。