Проблемы с новыми помощниками QFlags для qDebug () в QT5.5

У меня есть следующий код

#include <QDebug>  //Needed for other stuff!!
#include <QDataStream>

class TestClass {
public:
class SubClass {
public:
QString a;
int b;

/*
//Needed for QDataStream but not relevant for the generated error
friend QDataStream& operator<<(QDataStream& os, SubClass const& f)
{
os << f.a;
os << f.b;
return os;
}

friend QDataStream& operator>>(QDataStream& is, SubClass& f)
{
is >> f.a;
is >> f.b;
return is;
}*/

friend QDataStream& operator<< <SubClass>(QDataStream&, QList<SubClass> const&);
friend QDataStream& operator>> <SubClass>(QDataStream&, QList<SubClass>&);

};
};

Компиляция с qt5.5 дает мне следующие ошибки:

/usr/include/qt/QtCore/qflags.h:88: error: invalid application of 'sizeof' to an incomplete type 'TestClass::SubClass'
Q_STATIC_ASSERT_X((sizeof(Enum) <= sizeof(int)),
^~~~~~~~~~~~
/usr/include/qt/QtCore/qtypetraits.h:478: error: 'TestClass::SubClass' is an incomplete type
: integral_constant<bool, (T(0) < T(-1))> {};
^
/usr/include/qt/QtCore/qdebug.h:279: in instantiation of template class 'QtPrivate::IsQEnumHelper<QFlags<TestClass::SubClass> >' requested here
QtPrivate::IsQEnumHelper<T>::Value || QtPrivate::IsQEnumHelper<QFlags<T> >::Value,
^
main.cpp:25: while substituting explicitly-specified template arguments into function template 'operator<<'
friend QDataStream& operator<< <SubClass>(QDataStream&, QList<SubClass> const&);
^

Кажется, причина этого кроется в следующем коде файла заголовка QDebug (qdebug.h: 277):

template <class T>
inline typename QtPrivate::QEnableIf<
QtPrivate::IsQEnumHelper<T>::Value || QtPrivate::IsQEnumHelper<QFlags<T> >::Value,
QDebug>::Type
operator<<(QDebug debug, const QFlags<T> &flags)
{
//...
}

Компиляция с qt5.4 работает нормально. Выбрана правильная шаблонная функция (qdatastream.h: 241)

template <typename T>
QDataStream& operator<<(QDataStream& s, const QList<T>& l)
{
//...
}

Вопросы:

  1. Я хотел бы знать, почему шаблон из qdebug.h принимается во внимание. У меня есть некоторые идеи, но было бы неплохо получить ответ с соответствующими ссылками на стандарт c ++ и правильное объяснение.
  2. Есть ли обходной путь для этого или я должен отправить отчет об ошибке в qt?

1

Решение

Следующий (упрощенный код) генерирует ту же ошибку.

#include <QDebug>  //Needed to cause the error

class TestClassA {};
class TestClassB {};

template <typename T>
TestClassA& operator<<(TestClassA& s, T& l) {
Q_UNUSED(l)
return s;
}

template TestClassA& operator<< <TestClassB>(TestClassA& s, TestClassB& l);

Бугрепорт открыт по адресу: https://bugreports.qt.io/browse/QTBUG-47375

Обновить:
Они исправили это. Исправление будет включено в Qt 5.5.1

0

Другие решения


По вопросам рекламы [email protected]