Hi,
ms compiler uses access property of class methods for building the mangled name, so you should not change this between versions.
In Qt\5.4.0\qt-src\qtbase\src\corelib\kernel\qmetatype.h:643
you find this code
#ifndef Q_NO_TEMPLATE_FRIENDS
#ifndef Q_QDOC
template<typename T>
friend bool qRegisterSequentialConverter();
template<typename, bool> friend struct QtPrivate::ValueTypeIsMetaType;
template<typename, typename> friend struct QtPrivate::ConverterMemberFunction;
template<typename, typename> friend struct QtPrivate::ConverterMemberFunctionOk;
template<typename, typename, typename> friend struct QtPrivate::ConverterFunctor;
template<typename T>
friend bool qRegisterAssociativeConverter();
template<typename, bool> friend struct QtPrivate::AssociativeValueTypeIsMetaType;
template<typename, bool> friend struct QtPrivate::IsMetaTypePair;
template<typename, typename> friend struct QtPrivate::MetaTypeSmartPointerHelper;
#endif
#else
public:
#endif
static bool registerConverterFunction(const QtPrivate::AbstractConverterFunction *f, int from, int to);
static void unregisterConverterFunction(int from, int to);
#ifndef Q_QDOC
template<typename T>
friend bool qRegisterSequentialConverter();
template<typename, bool> friend struct QtPrivate::ValueTypeIsMetaType;
template<typename, typename> friend struct QtPrivate::ConverterMemberFunction;
template<typename, typename> friend struct QtPrivate::ConverterMemberFunctionOk;
template<typename, typename, typename> friend struct QtPrivate::ConverterFunctor;
template<typename T>
friend bool qRegisterAssociativeConverter();
template<typename, bool> friend struct QtPrivate::AssociativeValueTypeIsMetaType;
template<typename, bool> friend struct QtPrivate::IsMetaTypePair;
template<typename, typename> friend struct QtPrivate::MetaTypeSmartPointerHelper;
#endif
#else
public:
#endif
static bool registerConverterFunction(const QtPrivate::AbstractConverterFunction *f, int from, int to);
static void unregisterConverterFunction(int from, int to);
you can see public access depends on Q_NO_TEMPLATE_FRIENDS being defined.
if you look at Qt\5.3.2\qt-src\qtbase\src\corelib\global\qcompilerdetection.h:88
you see
#elif defined(_MSC_VER)
# define Q_CC_MSVC
# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# define Q_NO_TEMPLATE_FRIENDS
# define Q_CC_MSVC
# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# define Q_NO_TEMPLATE_FRIENDS
so Q_NO_TEMPLATE_FRIENDS is defined for every ms compiler.
in Qt\5.4.0\qt-src\qtbase\src\corelib\global\qcompilerdetection.h:80
you can see a change:
#elif defined(_MSC_VER)
# define Q_CC_MSVC (_MSC_VER)
# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# if _MSC_VER < 1600
# define Q_NO_TEMPLATE_FRIENDS
# endif
# define Q_CC_MSVC (_MSC_VER)
# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# if _MSC_VER < 1600
# define Q_NO_TEMPLATE_FRIENDS
# endif
so in 5.4 registerConverterFunction and unregisterConverterFunction arenow private when build with vs 2010 and above.
I have noticed that problem today with an own application ( build with qt before 5.4) where i get
The procedure entry point ?unregisterConverterFunction@QMetaType@@SAXHH@Z could not be located in the dynamic link library Qt5Core.dll.
when looking with depends.exe into the dll i cann only find a ?unregisterConverterFunction@QMetaType@@CAXHH@Z ( note the S/C differnce).
making public etc. depend on a define is imho a very bad idea and now we have the result broken binary compatibility, something which i think is taken a lot care of to NOT happen in Qt.
Regards,
Gunnar
_______________________________________________ Development mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/development
