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 中的警告设置,因此这些警告仅对库代码禁用。