2017-02-12 2 views
2

Я использую Qt 5.3 с MinGW 4.8.2 (из-за ограничений клиента версия Qt не может быть обновлена). Попытка connect QTcpSocket с выражением лямбда заканчивается ошибкой компилятора.Qt 5.3 connect with lambda

Я импортировал <QTcpSocket>, и мой класс наследует QObject публично. Макрос Q_OBJECT также был добавлен в файл заголовка.

Это, как я пытаюсь подключить разъем к лямбда-функции:

void TCPRequests::handleClient() { 
    QTcpSocket* sock = serv -> nextPendingConnection(); 
    connect(sock, &QTcpSocket::readyRead, [sock]() 
    { 
     // Do nothing 
    }); 
} 

компилируется и корректно работает на Qt 5.8, но не на 5,3 с MinGW 4.8.2.

Я также попытался сделать connect(sock, &QTcpSocket::readyRead, this, [sock]() {...}); (примечание, я также передаю в качестве третьего аргумента), но это не имеет значения.

В результате ошибки:

Первое:

D:\Documents\Development\X\TCPRequests.cpp:43: error: no matching function for call to 'TCPRequests::connect(QTcpSocket*&, void (QIODevice::*)(), TCPRequests::handleClient()::__lambda0)' });

Второе:

D:\Documents\Development\X\TCPRequests.cpp:43: error: template argument for 'template static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2)' uses local type 'TCPRequests::handleClient()::__lambda0' });

Третье:

D:\Documents\Development\X\TCPRequests.cpp:43: error: template argument for 'template static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer::Object*, Func1, Func2)' uses local type 'TCPRequests::handleClient()::__lambda0' });

Любая помощь будет очень признателен!

ответ

2

Возможно, вы захотите добавить файл CONFIG += c++11 в файл проекта (.pro), чтобы включить функции C++ 11 в вашем проекте.

Причина, по которой ошибка Qt 5.8 не возникает, заключается в том, что, начиная с Qt 5.7.0, C++ 11 по умолчанию включен, а старые компиляторы, которые не поддерживают C++ 11, не поддерживаются. См. note:

C++11 Support Required from the compiler

Qt has enabled usage of C++11 in Qt applications for a long time, but with Qt 5.7 we are also enabling use of C++11 in the Qt modules. Therefore Qt 5.7 requires C++11 support from the compiler, and has removed support from older compilers not providing adequate C++11 support.

+0

Большое спасибо! Было бы хорошо, что Qt Creator предупредил вас в этих случаях – vagaerg