Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Problem adding another constructor to QSslCertificate



  • I added another constructor like this:

        QSslCertificate(); // My new constructor
        explicit QSslCertificate(QIODevice *device, QSsl::EncodingFormat format = QSsl::Pem);
        explicit QSslCertificate(const QByteArray &data = QByteArray(), QSsl::EncodingFormat format = QSsl::Pem);
        QSslCertificate(const QSslCertificate &other);
    ...
    Q_DECLARE_METATYPE(QSslCertificate)
    

    Here's the initialization:

    QSslCertificate::QSslCertificate()
        : d(new QSslCertificatePrivate)
    {
        QSslSocketPrivate::ensureInitialized();
        d->x509 = X509_new();
    }
    

    Problem is when I go to compile this code i get the following error message:

    QtOpenGL: created fwd-include header(s) for <srcbase>/src/opengl/ { qgl.h (5), qgl_p.h (1), qglbuffer.h (2), qglcolormap.h (2), qglframebufferobject.h (3), qglframebufferobject_p.h (1), qglfunctions.h (3), qglpaintdevice_p.h (1), qglpixelbuffer.h (2), qglpixelbuffer_p.h (1), qglshaderprogram.h (3), qgraphicsshadereffect_p.h (1), qtopenglglobal.h (1) }
    In file included from ../../include/QtCore/qmetatype.h:1:0,
                     from ../../include/QtCore/../../../../../mnt/disk-2/builds/qt5/qtbase/src/corelib/kernel/qobject.h:54,
                     from ../../include/QtCore/qobject.h:1,
                     from ../../include/QtCore/../../../../../mnt/disk-2/builds/qt5/qtbase/src/corelib/kernel/qcoreapplication.h:46,
                     from ../../include/QtCore/qcoreapplication.h:1,
                     from /mnt/disk-2/builds/qt5/qtbase/src/corelib/global/qt_pch.h:62:
    ../../include/QtCore/../../../../../mnt/disk-2/builds/qt5/qtbase/src/corelib/kernel/qmetatype.h: In instantiation of ‘static void* QtMetaTypePrivate::QMetaTypeFunctionHelper<T, Accepted>::Construct(void*, const void*) [with T = QSslCertificate; bool Accepted = true]’:
    ../../include/QtCore/../../../../../mnt/disk-2/builds/qt5/qtbase/src/corelib/kernel/qmetatype.h:1682:53:   required from ‘int qRegisterNormalizedMetaType(const QByteArray&, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = QSslCertificate; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<QSslCertificate, true>::DefinedType]’
    ../../include/QtCore/../../../../../mnt/disk-2/builds/qt5/qtbase/src/corelib/kernel/qmetatype.h:1712:42:   required from ‘int qRegisterMetaType(const char*, T*, typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType) [with T = QSslCertificate; typename QtPrivate::MetaTypeDefinedHelper<T, (QMetaTypeId2<T>::Defined && (! QMetaTypeId2<T>::IsBuiltIn))>::DefinedType = QtPrivate::MetaTypeDefinedHelper<QSslCertificate, true>::DefinedType]’
    ../../include/QtNetwork/../../../../../mnt/disk-2/builds/qt5/qtbase/src/network/ssl/qsslcertificate.h:208:1:   required from here
    ../../include/QtCore/../../../../../mnt/disk-2/builds/qt5/qtbase/src/corelib/kernel/qmetatype.h:766:16: error: call of overloaded ‘QSslCertificate()’ is ambiguous
             return new (where) T;
                    ^~~~~~~~~~~~~
    cd themes/ && ( test -e Makefile || /tmp/makepkg/qt5-base-server-side-sni/bin/qmake -o Makefile /mnt/disk-2/builds/qt5/qtbase/src/platformsupport/themes/themes.pro ) && make -f Makefile 
    In file included from ../../include/QtNetwork/qsslcertificate.h:1:0,
                     from ../../include/QtNetwork/../../../../../mnt/disk-2/builds/qt5/qtbase/src/network/ssl/qsslerror.h:46,
                     from ../../include/QtNetwork/qsslerror.h:1,
                     from ../../include/QtNetwork/../../../../../mnt/disk-2/builds/qt5/qtbase/src/network/ssl/qsslsocket.h:49,
                     from ../../include/QtNetwork/qsslsocket.h:1,
                     from ../../include/QtNetwork/../../../../../mnt/disk-2/builds/qt5/qtbase/src/network/ssl/qsslconfiguration.h:61,
                     from ../../include/QtNetwork/qsslconfiguration.h:1,
                     from ../../include/QtNetwork/QSslConfiguration:1,
                     from /mnt/disk-2/builds/qt5/qtbase/src/network/access/qnetworkaccessmanager.h:46,
                     from /mnt/disk-2/builds/qt5/qtbase/src/network/access/qnetworkaccessmanager_p.h:55,
                     from /mnt/disk-2/builds/qt5/qtbase/src/network/access/qnetworkaccesscache.cpp:44:
    ../../include/QtNetwork/../../../../../mnt/disk-2/builds/qt5/qtbase/src/network/ssl/qsslcertificate.h:91:5: note: candidate: QSslCertificate::QSslCertificate(const QByteArray&, QSsl::EncodingFormat)
         QSslCertificate(const QByteArray &data = QByteArray(), QSsl::EncodingFormat format = QSsl::Pem);
         ^~~~~~~~~~~~~~~
    ../../include/QtNetwork/../../../../../mnt/disk-2/builds/qt5/qtbase/src/network/ssl/qsslcertificate.h:89:5: note: candidate: QSslCertificate::QSslCertificate()
         QSslCertificate();
         ^~~~~~~~~~~~~~~
    

    It's erroring on the macro Q_DECLARE_METATYPE, and I can't figure out why. QFileInfo and QDBusUnixFileDescriptor are examples that are doing the same thing without any problems.

    QFileInfo:

        QFileInfo();
        QFileInfo(const QString &file);
        QFileInfo(const QFile &file);
        QFileInfo(const QDir &dir, const QString &file);
        QFileInfo(const QFileInfo &fileinfo);
        ~QFileInfo();
    ...
    Q_DECLARE_METATYPE(QFileInfo)
    

    QDBusUnixFileDescriptor:

        QDBusUnixFileDescriptor();
        explicit QDBusUnixFileDescriptor(int fileDescriptor);
        QDBusUnixFileDescriptor(const QDBusUnixFileDescriptor &other);
    #if defined(Q_COMPILER_RVALUE_REFS)
        QDBusUnixFileDescriptor &operator=(QDBusUnixFileDescriptor &&other) Q_DECL_NOTHROW { swap(other); return *this; }
    #endif
        QDBusUnixFileDescriptor &operator=(const QDBusUnixFileDescriptor &other);
        ~QDBusUnixFileDescriptor();
    ...
    Q_DECLARE_METATYPE(QDBusUnixFileDescriptor)
    

    I'm trying to create a null certificate so I can then populate it with information dynamically with the purpose of giving QtSsl the ability to create Ssl certificates. This is driving me nuts. Any help would be greatly appreciated.


  • Moderators

    You have 2 constructors that do the same thing.

    You have a default with QSslCertificate() then you have an overloaded one with QSslCertificate(const QByteArray &data = QByteArray(), QSsl::EncodingFormat format = QSsl::Pem).

    So it's telling you the constructor call is ambiguous as it doesn't know how to differentiate between those 2. Add a non-defaulted parameter to your constructor or (and this isn't a good idea) remove the QByteArray() default from Qt's constructor.



  • Thank you very much for the answer. I didn't even notice that QByteArray &data had a default value, and didn't take that into account! You saved me from tearing my hair out.


Log in to reply