[Interest] Compile error: with QtConcurrent and GCC 4.8.3 and Qt 5.3.2
Richard Öhlinger
r.oehlinger at avibit.com
Wed May 13 16:22:25 CEST 2015
Hi!
I've faced struggles compiling following (simplified) piece of code:
QStringList data;
QString res = QtConcurrent::blockingFilteredReduced(data,
[](const QString&) {return true;}, [](QString& result, const QString& s)
-> void {result = s;});
Compiler output:
/home/user/main.cpp: In member function 'void main()':
/home/user/main.cpp:350:165: error: no matching function for call to
'blockingFilteredReduced(QStringList&, main()::__lambda0,
main()::__lambda1)'
QStringList res = QtConcurrent::blockingFilteredReduced(data,
[](const QString&) {return true;}, [](QString& result, const QString& s)
-> void {result = s;});
^
/home/user/main.cpp:350:165: note: candidates are:
In file included from /opt/qt-5/5.3.2/include/QtConcurrent/QtConcurrent:6:0,
from /home/user/main.cpp:23:
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:188:12: note:
template<class ResultType, class Sequence, class KeepFunctor, class
ReduceFunctor> ResultType QtConcurrent::blockingFilteredReduced(const
Sequence&, KeepFunctor, ReduceFunctor, QtConcurrent::ReduceOptions)
ResultType blockingFilteredReduced(const Sequence &sequence,
^
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:188:12:
note: template argument deduction/substitution failed:
/home/user/main.cpp:350:165: note: couldn't deduce template parameter
'ResultType'
QStringList res = QtConcurrent::blockingFilteredReduced(data,
[](const QString&) {return true;}, [](QString& result, const QString& s)
-> void {result = s;});
^
In file included from /opt/qt-5/5.3.2/include/QtConcurrent/QtConcurrent:6:0,
from /home/user/main.cpp:23:
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:198:65: note:
template<class Sequence, class KeepFunctor, class ReduceFunctor>
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType
QtConcurrent::blockingFilteredReduced(const Sequence&, KeepFunctor,
ReduceFunctor, QtConcurrent::ReduceOptions)
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType
blockingFilteredReduced(const Sequence &sequence,
^
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:198:65:
note: template argument deduction/substitution failed:
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h: In
substitution of 'template<class Sequence, class KeepFunctor, class
ReduceFunctor> typename
QtPrivate::ReduceResultType<ReduceFunctor>::ResultType
QtConcurrent::blockingFilteredReduced(const Sequence&, KeepFunctor,
ReduceFunctor, QtConcurrent::ReduceOptions) [with Sequence =
QStringList; KeepFunctor = main()::__lambda0; ReduceFunctor =
main()::__lambda1]':
/home/user/main.cpp:350:165: required from here
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:198:65: error:
invalid use of incomplete type 'struct
QtPrivate::ReduceResultType<main()::__lambda1>'
In file included from
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:50:0,
from /opt/qt-5/5.3.2/include/QtConcurrent/QtConcurrent:6,
from /home/user/main.cpp:23:
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfunctionwrappers.h:222:8:
error: declaration of 'struct
QtPrivate::ReduceResultType<main()::__lambda1>'
struct ReduceResultType;
^
In file included from /opt/qt-5/5.3.2/include/QtConcurrent/QtConcurrent:6:0,
from /home/user/main.cpp:23:
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:212:12: note:
template<class ResultType, class Iterator, class KeepFunctor, class
ReduceFunctor> ResultType
QtConcurrent::blockingFilteredReduced(Iterator, Iterator, KeepFunctor,
ReduceFunctor, QtConcurrent::ReduceOptions)
ResultType blockingFilteredReduced(Iterator begin,
^
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:212:12:
note: template argument deduction/substitution failed:
/home/user/main.cpp:350:165: note: deduced conflicting types for
parameter 'Iterator' ('QStringList' and 'main()::__lambda0')
QStringList res = QtConcurrent::blockingFilteredReduced(data,
[](const QString&) {return true;}, [](QString& result, const QString& s)
-> void {result = s;});
^
In file included from /opt/qt-5/5.3.2/include/QtConcurrent/QtConcurrent:6:0,
from /home/user/main.cpp:23:
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:227:65: note:
template<class Iterator, class KeepFunctor, class ReduceFunctor>
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType
QtConcurrent::blockingFilteredReduced(Iterator, Iterator, KeepFunctor,
ReduceFunctor, QtConcurrent::ReduceOptions)
typename QtPrivate::ReduceResultType<ReduceFunctor>::ResultType
blockingFilteredReduced(Iterator begin,
^
/opt/qt-5/5.3.2/include/QtConcurrent/qtconcurrentfilter.h:227:65:
note: template argument deduction/substitution failed:
/home/user/main.cpp:350:165: note: deduced conflicting types for
parameter 'Iterator' ('QStringList' and 'main()::__lambda0')
QStringList res = QtConcurrent::blockingFilteredReduced(data,
[](const QString&) {return true;}, [](QString& result, const QString& s)
-> void {result = s;});
^
Am I using the library wrong, or is there a bug within the compiler,
because following compiles work:
QStringList data;
void (*ptr)(QString&, const QString&);
ptr = [](QString& result, const QString& s) -> void {result = s;};
QString res = QtConcurrent::blockingFilteredReduced(data,
[](const QString&) ->bool {return true;}, ptr);
Best Regards,
Richard
More information about the Interest
mailing list