From: Vadim Zeitlin Date: Fri, 14 Sep 2007 21:02:09 +0000 (+0000) Subject: added WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE() macro and use it to work around VC6 warnin... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7c77f33480e32a3a5f142850ac0e9605d0c05381 added WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE() macro and use it to work around VC6 warnings about non DLL-exported templates git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48691 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/buffer.h b/include/wx/buffer.h index c4cb0dc208..a18b85c762 100644 --- a/include/wx/buffer.h +++ b/include/wx/buffer.h @@ -150,6 +150,8 @@ private: bool m_owned; }; +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer ) + class WXDLLIMPEXP_BASE wxCharBuffer : public wxCharTypeBuffer { public: @@ -165,6 +167,8 @@ public: }; #if wxUSE_WCHAR_T +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer ) + class WXDLLIMPEXP_BASE wxWCharBuffer : public wxCharTypeBuffer { public: diff --git a/include/wx/dlimpexp.h b/include/wx/dlimpexp.h index 3df4f4e603..f6effd3444 100644 --- a/include/wx/dlimpexp.h +++ b/include/wx/dlimpexp.h @@ -281,5 +281,34 @@ #define WXDLLEXPORT WXDLLIMPEXP_CORE #define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_CORE +/* + MSVC up to 6.0 needs to be explicitly told to export template instantiations + used by the DLL clients, use this macro to do it like this: + + template class Foo { ... }; + WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo ) + + (notice that currently we only need this for the wxBase library) + */ +#if defined(__VISUALC__) && (__VISUALC__ <= 1200) + #ifdef WXMAKINGDLL_BASE + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \ + template class WXDLLIMPEXP_BASE decl; + #else + /* + We need to disable this warning when using this macro, as + recommended by Microsoft itself: + + http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b168958 + */ + #pragma warning(disable:4231) + + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) \ + extern template class WXDLLIMPEXP_BASE decl; + #endif +#else /* not VC <= 6 */ + #define WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(decl) +#endif /* VC6/others */ + #endif /* _WX_DLIMPEXP_H_ */ diff --git a/include/wx/string.h b/include/wx/string.h index 87bd52c54a..3b112d582d 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -2834,6 +2834,9 @@ public: }; #if wxUSE_STL_BASED_WXSTRING + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase ) + class wxStringInternalBuffer : public wxStringTypeBufferBase { public: @@ -2845,7 +2848,11 @@ public: DECLARE_NO_COPY_CLASS(wxStringInternalBuffer) }; -class wxStringInternalBufferLength : public wxStringTypeBufferLengthBase +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( + wxStringTypeBufferLengthBase ) + +class wxStringInternalBufferLength + : public wxStringTypeBufferLengthBase { public: wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024) @@ -2874,6 +2881,9 @@ typedef wxStringInternalBufferLength wxStringBufferLength; typedef wxStringInternalBuffer wxUTF8StringBuffer; typedef wxStringInternalBufferLength wxUTF8StringBufferLength; #elif wxUSE_UNICODE_WCHAR + +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase ) + class WXDLLIMPEXP_BASE wxUTF8StringBuffer : public wxStringTypeBufferBase { public: @@ -2884,6 +2894,8 @@ public: DECLARE_NO_COPY_CLASS(wxUTF8StringBuffer) }; +WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferLengthBase ) + class WXDLLIMPEXP_BASE wxUTF8StringBufferLength : public wxStringTypeBufferLengthBase {