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
This commit is contained in:
Vadim Zeitlin
2007-09-14 21:02:09 +00:00
parent cb626df225
commit 7c77f33480
3 changed files with 46 additions and 1 deletions

View File

@@ -150,6 +150,8 @@ private:
bool m_owned; bool m_owned;
}; };
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer<char> )
class WXDLLIMPEXP_BASE wxCharBuffer : public wxCharTypeBuffer<char> class WXDLLIMPEXP_BASE wxCharBuffer : public wxCharTypeBuffer<char>
{ {
public: public:
@@ -165,6 +167,8 @@ public:
}; };
#if wxUSE_WCHAR_T #if wxUSE_WCHAR_T
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxCharTypeBuffer<wchar_t> )
class WXDLLIMPEXP_BASE wxWCharBuffer : public wxCharTypeBuffer<wchar_t> class WXDLLIMPEXP_BASE wxWCharBuffer : public wxCharTypeBuffer<wchar_t>
{ {
public: public:

View File

@@ -281,5 +281,34 @@
#define WXDLLEXPORT WXDLLIMPEXP_CORE #define WXDLLEXPORT WXDLLIMPEXP_CORE
#define WXDLLEXPORT_DATA WXDLLIMPEXP_DATA_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 <typename T> class Foo { ... };
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( Foo<int> )
(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_ */ #endif /* _WX_DLIMPEXP_H_ */

View File

@@ -2834,6 +2834,9 @@ public:
}; };
#if wxUSE_STL_BASED_WXSTRING #if wxUSE_STL_BASED_WXSTRING
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase<wxStringCharType> )
class wxStringInternalBuffer : public wxStringTypeBufferBase<wxStringCharType> class wxStringInternalBuffer : public wxStringTypeBufferBase<wxStringCharType>
{ {
public: public:
@@ -2845,7 +2848,11 @@ public:
DECLARE_NO_COPY_CLASS(wxStringInternalBuffer) DECLARE_NO_COPY_CLASS(wxStringInternalBuffer)
}; };
class wxStringInternalBufferLength : public wxStringTypeBufferLengthBase<wxStringCharType> WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE(
wxStringTypeBufferLengthBase<wxStringCharType> )
class wxStringInternalBufferLength
: public wxStringTypeBufferLengthBase<wxStringCharType>
{ {
public: public:
wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024) wxStringInternalBufferLength(wxString& str, size_t lenWanted = 1024)
@@ -2874,6 +2881,9 @@ typedef wxStringInternalBufferLength wxStringBufferLength;
typedef wxStringInternalBuffer wxUTF8StringBuffer; typedef wxStringInternalBuffer wxUTF8StringBuffer;
typedef wxStringInternalBufferLength wxUTF8StringBufferLength; typedef wxStringInternalBufferLength wxUTF8StringBufferLength;
#elif wxUSE_UNICODE_WCHAR #elif wxUSE_UNICODE_WCHAR
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferBase<char> )
class WXDLLIMPEXP_BASE wxUTF8StringBuffer : public wxStringTypeBufferBase<char> class WXDLLIMPEXP_BASE wxUTF8StringBuffer : public wxStringTypeBufferBase<char>
{ {
public: public:
@@ -2884,6 +2894,8 @@ public:
DECLARE_NO_COPY_CLASS(wxUTF8StringBuffer) DECLARE_NO_COPY_CLASS(wxUTF8StringBuffer)
}; };
WXDLLIMPEXP_TEMPLATE_INSTANCE_BASE( wxStringTypeBufferLengthBase<char> )
class WXDLLIMPEXP_BASE wxUTF8StringBufferLength class WXDLLIMPEXP_BASE wxUTF8StringBufferLength
: public wxStringTypeBufferLengthBase<char> : public wxStringTypeBufferLengthBase<char>
{ {