[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