refs #413, #416 Workaround GCC 4.7 bug.

(cherry picked from commit 5b1a25489a545bddd66978a6b9a819742c5925d2)
This commit is contained in:
Mathew Sutcliffe
2015-05-09 00:31:33 +01:00
parent b6f8654312
commit f7eecdafe0

View File

@@ -25,6 +25,16 @@ namespace BlackMisc
class CPropertyIndexVariantMap;
// workaround GCC 4.7 bug
namespace Aviation { template <typename AVIO> class CModulator; }
namespace Private
{
template <typename T> struct is_default_constructible : std::is_default_constructible<T> {};
# if __GNUC__ == 4 && __GNUC_MINOR__ <= 7
template <typename T> struct is_default_constructible<Aviation::CModulator<T>> : std::false_type {};
# endif
}
namespace Mixin
{
@@ -66,14 +76,14 @@ namespace BlackMisc
const Derived *derived() const { return static_cast<const Derived *>(this); }
Derived *derived() { return static_cast<Derived *>(this); }
template <typename T, typename std::enable_if<std::is_default_constructible<T>::value, int>::type = 0>
template <typename T, typename std::enable_if<Private::is_default_constructible<T>::value, int>::type = 0>
CVariant myself() const { return CVariant::from(*derived()); }
template <typename T, typename std::enable_if<std::is_default_constructible<T>::value, int>::type = 0>
template <typename T, typename std::enable_if<Private::is_default_constructible<T>::value, int>::type = 0>
void myself(const CVariant &variant) { *derived() = variant.to<T>(); }
template <typename T, typename std::enable_if<! std::is_default_constructible<T>::value, int>::type = 0>
template <typename T, typename std::enable_if<! Private::is_default_constructible<T>::value, int>::type = 0>
CVariant myself() const { qFatal("isMyself should have been handled before reaching here"); return {}; }
template <typename T, typename std::enable_if<! std::is_default_constructible<T>::value, int>::type = 0>
template <typename T, typename std::enable_if<! Private::is_default_constructible<T>::value, int>::type = 0>
void myself(const CVariant &) { qFatal("isMyself should have been handled before reaching here"); }
template <typename T>