qxmpp-project / qxmpp

Cross-platform C++ XMPP client and server library
411 stars 197 forks source link

Build error on Qt 5.15.2 #636

Closed sanderfoobar closed 2 months ago

sanderfoobar commented 3 months ago

on master (97ddd0b187a6e54726470fcbb4e772a715a49e23) I get a template error: QXmppSasl.cpp:1029:9: error: class template argument deduction failed

qxmpp builds fine on Qt 6.7.0, but on another machine with Qt 5.15.2:

$ apt policy qtbase5-dev
qtbase5-dev:
  Installed: 5.15.2+dfsg-9

$ g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110

$ cmake --version
cmake version 3.18.4

$ cmake -Bbuild .
-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Choosing Qt 5
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_VISIBILITY - Success
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY
-- Performing Test COMPILER_HAS_HIDDEN_INLINE_VISIBILITY - Success
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR
-- Performing Test COMPILER_HAS_DEPRECATED_ATTR - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/qxmpp/build

$ make -Cbuild -j4

make: Entering directory '/home/user/qxmpp/build'
make[1]: Entering directory '/home/user/qxmpp/build'
make[2]: Entering directory '/home/user/qxmpp/build'
Scanning dependencies of target QXmppQt5_autogen
make[2]: Leaving directory '/home/user/qxmpp/build'
make[2]: Entering directory '/home/user/qxmpp/build'
[  1%] Automatic MOC for target QXmppQt5
make[2]: Leaving directory '/home/user/qxmpp/build'
[  1%] Built target QXmppQt5_autogen
make[2]: Entering directory '/home/user/qxmpp/build'
Scanning dependencies of target QXmppQt5
make[2]: Leaving directory '/home/user/qxmpp/build'
make[2]: Entering directory '/home/user/qxmpp/build'
[  1%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppBitsOfBinaryContentId.cpp.o
[  1%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppBindIq.cpp.o
[  2%] Building CXX object src/CMakeFiles/QXmppQt5.dir/QXmppQt5_autogen/mocs_compilation.cpp.o
[  2%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppArchiveIq.cpp.o
[  3%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppBitsOfBinaryData.cpp.o
[  3%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppBitsOfBinaryIq.cpp.o
[  3%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppBookmarkSet.cpp.o
[  3%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppByteStreamIq.cpp.o
[  4%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppDataForm.cpp.o
[  4%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppDataFormBase.cpp.o
[  4%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppDiscoveryIq.cpp.o
[  4%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppElement.cpp.o
[  5%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppEncryptedFileSource.cpp.o
[  5%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppEntityTimeIq.cpp.o
[  5%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppError.cpp.o
[  5%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppExternalServiceDiscoveryIq.cpp.o
[  6%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppFileMetadata.cpp.o
[  6%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppFileShare.cpp.o
[  6%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppGeolocItem.cpp.o
[  6%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppGlobal.cpp.o
[  6%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppHash.cpp.o
[  7%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppHashing.cpp.o
[  7%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppHttpFileSource.cpp.o
[  7%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppHttpUploadIq.cpp.o
[  7%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppIbbIq.cpp.o
[  8%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppIq.cpp.o
[  8%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppJingleData.cpp.o
[  8%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppLogger.cpp.o
[  8%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMamIq.cpp.o
[  9%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMessage.cpp.o
[  9%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMessageReaction.cpp.o
[  9%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMixInvitation.cpp.o
[  9%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMixIq.cpp.o
[ 10%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMixItems.cpp.o
[ 10%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppMucIq.cpp.o
[ 10%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppNonza.cpp.o
[ 10%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppNonSASLAuth.cpp.o
[ 10%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppOutOfBandUrl.cpp.o
[ 11%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPacket.cpp.o
[ 11%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPingIq.cpp.o
[ 11%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPresence.cpp.o
[ 11%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubAffiliation.cpp.o
[ 12%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubEvent.cpp.o
[ 12%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubIq.cpp.o
[ 12%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubBaseItem.cpp.o
[ 12%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubMetadata.cpp.o
[ 13%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubNodeConfig.cpp.o
[ 13%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubSubscribeOptions.cpp.o
[ 13%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubSubscription.cpp.o
[ 13%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPubSubSubAuthorization.cpp.o
[ 14%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppPushEnableIq.cpp.o
[ 14%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppRegisterIq.cpp.o
[ 14%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppResultSet.cpp.o
[ 14%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppRosterIq.cpp.o
[ 14%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppRpcIq.cpp.o
[ 15%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppSasl.cpp.o
[ 15%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppSocks.cpp.o
[ 15%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppStanza.cpp.o
[ 15%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppStream.cpp.o
/home/user/qxmpp/src/base/QXmppSasl.cpp: In member function ‘QString QXmpp::Private::SaslMechanism::toString() const’:
/home/user/qxmpp/src/base/QXmppSasl.cpp:817:9: error: class template argument deduction failed:
  817 |         },
      |         ^
/home/user/qxmpp/src/base/QXmppSasl.cpp:817:9: error: no matching function for call to ‘overloaded(QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslScramMechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslHtMechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslDigestMd5Mechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslPlainMechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslAnonymousMechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslXFacebookMechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslXWindowsLiveMechanism)>, QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslXGoogleMechanism)>)’
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note: candidate: ‘template<class ... Ts> overloaded()-> overloaded<Ts>’
   28 | struct overloaded : Ts... {
      |        ^~~~~~~~~~
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note:   template argument deduction/substitution failed:
/home/user/qxmpp/src/base/QXmppSasl.cpp:817:9: note:   candidate expects 0 arguments, 8 provided
  817 |         },
      |         ^
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note: candidate: ‘template<class ... Ts> overloaded(overloaded<Ts>)-> overloaded<Ts>’
   28 | struct overloaded : Ts... {
      |        ^~~~~~~~~~
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note:   template argument deduction/substitution failed:
/home/user/qxmpp/src/base/QXmppSasl.cpp:817:9: note:   ‘QXmpp::Private::SaslMechanism::toString() const::<lambda(QXmpp::Private::SaslScramMechanism)>’ is not derived from ‘overloaded<Ts>’
  817 |         },
      |         ^
/home/user/qxmpp/src/base/QXmppSasl.cpp: In static member function ‘static bool QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)’:
/home/user/qxmpp/src/base/QXmppSasl.cpp:986:15: error: class template argument deduction failed:
  986 |             } },
      |               ^
/home/user/qxmpp/src/base/QXmppSasl.cpp:986:15: error: no matching function for call to ‘overloaded(QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(QXmpp::Private::SaslHtMechanism)>, QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(std::variant<QXmpp::Private::SaslScramMechanism, QXmpp::Private::SaslDigestMd5Mechanism, QXmpp::Private::SaslPlainMechanism>)>, QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(QXmpp::Private::SaslXFacebookMechanism)>, QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(QXmpp::Private::SaslXWindowsLiveMechanism)>, QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(QXmpp::Private::SaslXGoogleMechanism)>, QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(QXmpp::Private::SaslAnonymousMechanism)>)’
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note: candidate: ‘template<class ... Ts> overloaded()-> overloaded<Ts>’
   28 | struct overloaded : Ts... {
      |        ^~~~~~~~~~
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note:   template argument deduction/substitution failed:
/home/user/qxmpp/src/base/QXmppSasl.cpp:986:15: note:   candidate expects 0 arguments, 6 provided
  986 |             } },
      |               ^
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note: candidate: ‘template<class ... Ts> overloaded(overloaded<Ts>)-> overloaded<Ts>’
   28 | struct overloaded : Ts... {
      |        ^~~~~~~~~~
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note:   template argument deduction/substitution failed:
/home/user/qxmpp/src/base/QXmppSasl.cpp:986:15: note:   ‘QXmppSaslClient::isMechanismAvailable(QXmpp::Private::SaslMechanism, const QXmpp::Private::Credentials&)::<lambda(QXmpp::Private::SaslHtMechanism)>’ is not derived from ‘overloaded<Ts>’
  986 |             } },
      |               ^
/home/user/qxmpp/src/base/QXmppSasl.cpp: In static member function ‘static std::unique_ptr<QXmppSaslClient> QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)’:
/home/user/qxmpp/src/base/QXmppSasl.cpp:1029:9: error: class template argument deduction failed:
 1029 |         },
      |         ^
/home/user/qxmpp/src/base/QXmppSasl.cpp:1029:9: error: no matching function for call to ‘overloaded(QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslScramMechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslHtMechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslPlainMechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslDigestMd5Mechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslAnonymousMechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslXFacebookMechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslXWindowsLiveMechanism)>, QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslXGoogleMechanism)>)’
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note: candidate: ‘template<class ... Ts> overloaded()-> overloaded<Ts>’
   28 | struct overloaded : Ts... {
      |        ^~~~~~~~~~
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note:   template argument deduction/substitution failed:
/home/user/qxmpp/src/base/QXmppSasl.cpp:1029:9: note:   candidate expects 0 arguments, 8 provided
 1029 |         },
      |         ^
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note: candidate: ‘template<class ... Ts> overloaded(overloaded<Ts>)-> overloaded<Ts>’
   28 | struct overloaded : Ts... {
      |        ^~~~~~~~~~
/home/user/qxmpp/src/base/QXmppSasl.cpp:28:8: note:   template argument deduction/substitution failed:
/home/user/qxmpp/src/base/QXmppSasl.cpp:1029:9: note:   ‘QXmppSaslClient::create(QXmpp::Private::SaslMechanism, QObject*)::<lambda(QXmpp::Private::SaslScramMechanism)>’ is not derived from ‘overloaded<Ts>’
 1029 |         },
      |         ^
[ 16%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppStreamFeatures.cpp.o
[ 16%] Building CXX object src/CMakeFiles/QXmppQt5.dir/base/QXmppStreamInitiationIq.cpp.o
make[2]: *** [src/CMakeFiles/QXmppQt5.dir/build.make:797: src/CMakeFiles/QXmppQt5.dir/base/QXmppSasl.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/home/user/qxmpp/build'
make[1]: *** [CMakeFiles/Makefile2:480: src/CMakeFiles/QXmppQt5.dir/all] Error 2
make[1]: Leaving directory '/home/user/qxmpp/build'
make: *** [Makefile:160: all] Error 2
make: Leaving directory '/home/user/qxmpp/build'

Similar issue: https://github.com/qxmpp-project/qxmpp/issues/18

However in that case it has error: forward declaration of 'class QSslSocket' and I can import #include <QSslSocket> fine, I also have:

$ find /usr | grep -i QSslSocket
/usr/include/x86_64-linux-gnu/qt5/QtNetwork/QSslSocket
/usr/include/x86_64-linux-gnu/qt5/QtNetwork/qsslsocket.h

So I dont think it is related to Qt's SSL support.

lnjX commented 2 months ago

It looks like your compiler g++ 10.2 could be too old in this case. QXmpp master requires C++20, g++ 10.2 supports most of the C++20 features, but not everything.

I don't know why you think this is related to #18. I don't see something about QSslSocket in the error message.

sanderfoobar commented 2 months ago

ah, thanks :)