從DLL 匯出包含std:: 物件的類別
從DLL 匯出包含std::vectors 和std::strings 等物件的類別時DLL、警告,例如“class 'std::map<_kty>'需要“FontManager”類別的客戶端使用dll 介面”,可能會出現。此警告表示該類別的成員類型需要 DLL 介面才能由客戶端程式碼存取。
標準容器的轉送宣告
要解決此問題,請轉送帶有DLL_EXPORT 的類別宣告可以放在成員變數之前,如下所示:
template class DLL_EXPORT std::allocator<tCharGlyphProviderRef>; template class DLL_EXPORT std::vector<tCharGlyphProviderRef,std::allocator<tCharGlyphProviderRef> >; std::vector<tCharGlyphProviderRef> m_glyphProviders;
雖然這種方法可能會刪除警告,它不保證成員函數的DLL 介面的可用性。
DLL 介面要求
為了確保正確的 DLL 功能,類別及其成員函數必須具有DLL 介面。這意味著編譯器在 DLL 本身內產生函數,使其可導入。如果未能為客戶端程式碼可存取的成員提供此接口,將導致在編譯或連結期間出現警告或錯誤。
私有成員和警告
客戶端無法存取私有成員可以免除 DLL_EXPORT 宣告。可以停用對此類成員的警告。但是,應謹慎對待編譯器產生的析構函數和建構函式。
Dll 可匯出成員處理
客戶端必須使用的成員需要:
Dll 匯出包裝器: 建立從對成員執行操作的DLL 匯出的代理程式。
間接方法:
實作為成員提供間接存取的方法,並匯出這些方法。 PIMPL 慣用法: 使用私有實作(PIMPL) 慣用法來降低外部可見性模板類別的實例化使用DLL_EXPORT 的模板類別的前向聲明僅在目前編譯單元內建立實例化。這種方法對於非模板類別來說是不夠的。以上是如何從 DLL 匯出包含 std:: 物件的類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!