A better fix for wxHash{Map,Set} with g++ 4.7.
This reverts r70556, i.e. removes the scope operators added by it to all WX_DECLARE_HASH_{MAP,SET} macros, and implements a workaround for the problem due to the use of empty base class optimization in g++ 4.7 standard library implementations inside the macros themselves by prepending the hasher and comparator classes with explicit "struct". git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72297 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -46,7 +46,7 @@
|
||||
|
||||
// we need to define the class declared by _WX_DECLARE_HASH_SET as a class and
|
||||
// not a typedef to allow forward declaring it
|
||||
#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \
|
||||
#define _WX_DECLARE_HASH_SET_IMPL( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \
|
||||
CLASSEXP CLASSNAME \
|
||||
: public WX_HASH_SET_BASE_TEMPLATE< KEY_T, HASH_T, KEY_EQ_T > \
|
||||
{ \
|
||||
@@ -69,6 +69,31 @@ public: \
|
||||
{} \
|
||||
}
|
||||
|
||||
// In some standard library implementations (in particular, the libstdc++ that
|
||||
// ships with g++ 4.7), std::unordered_set inherits privately from its hasher
|
||||
// and comparator template arguments for purposes of empty base optimization.
|
||||
// As a result, in the declaration of a class deriving from std::unordered_set
|
||||
// the names of the hasher and comparator classes are interpreted as naming
|
||||
// the base class which is inaccessible.
|
||||
// The workaround is to prefix the class names with 'struct'; however, don't
|
||||
// do this on MSVC because it causes a warning there if the class was
|
||||
// declared as a 'class' rather than a 'struct' (and MSVC's std::unordered_set
|
||||
// implementation does not suffer from the access problem).
|
||||
#ifdef _MSC_VER
|
||||
#define WX_MAYBE_PREFIX_WITH_STRUCT(STRUCTNAME) STRUCTNAME
|
||||
#else
|
||||
#define WX_MAYBE_PREFIX_WITH_STRUCT(STRUCTNAME) struct STRUCTNAME
|
||||
#endif
|
||||
|
||||
#define _WX_DECLARE_HASH_SET( KEY_T, HASH_T, KEY_EQ_T, PTROP, CLASSNAME, CLASSEXP ) \
|
||||
_WX_DECLARE_HASH_SET_IMPL( \
|
||||
KEY_T, \
|
||||
WX_MAYBE_PREFIX_WITH_STRUCT(HASH_T), \
|
||||
WX_MAYBE_PREFIX_WITH_STRUCT(KEY_EQ_T), \
|
||||
PTROP, \
|
||||
CLASSNAME, \
|
||||
CLASSEXP)
|
||||
|
||||
#else // no appropriate STL class, use our own implementation
|
||||
|
||||
// this is a complex way of defining an easily inlineable identity function...
|
||||
|
Reference in New Issue
Block a user