Не удается загрузить частный сигнал QOverload, используя пример Qt docs

#c #qt

Вопрос:

Здесь в документации Qt написано:

Примечание: Это частный сигнал. Он может использоваться в сигнальных соединениях, но не может излучаться пользователем.

Примечание: Активированный сигнал перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя функции, Qt предоставляет удобный помощник для получения указателя функции, как показано в этом примере:

 connect(socketNotifier, QOverload<QSocketDescriptor, QSocketNotifier::Type>::of(amp;QSocketNotifier::activated),
    [=](QSocketDescriptor socket, QSocketNotifier::Type type){ /* ... */ });
 

Когда я им пользуюсь, у меня возникает такая проблема:

 error: no matching function for call to 'of'

/usr/include/qt5/QtCore/qglobal.h:1224: candidate template ignored: could not match 'type-parameter-0-0 (QSocketDescriptor, QSocketNotifier::Type) const' against 'void (QSocketDescriptor, QSocketNotifier::Type, QSocketNotifier::QPrivateSignal)'

/usr/include/qt5/QtCore/qglobal.h:1212: candidate template ignored: failed template argument deduction

/usr/include/qt5/QtCore/qglobal.h:1241: candidate template ignored: could not match 'R (*)(QSocketDescriptor, QSocketNotifier::Type)' against 'void (QSocketNotifier::*)(QSocketDescriptor, QSocketNotifier::Type, QSocketNotifier::QPrivateSignal)'
 

Я просто скопировал и вставил пример, <QSocketDescriptor> и <QSocketNotifier> оба заголовка включены. Что я упускаю?

Комментарии:

1. Может быть, глупый вопрос, но вы используете Qt 5.15 правильно?

2. Здесь вообще нет необходимости в QOverload, так как существует только одна функция QSignalNotifier::activated (), поэтому нет двусмысленности и необходимости в QOverload.

3. @mascoj 5.15, потому что в Qt6 нет QSerialPort, и он мне нужен

4. @chehrlic он перегружен, он также активирован(int) там 🙁 5.15, извините, я не упомянул версию. В комментарии к коду указано, что он будет удален, так что, вероятно, он исчез в Qt6, но возникает вопрос: почему я не могу так загрузить QOverload?

5. Ах, это из activated(QSocketDescriptor socket, QSocketNotifier::Type activationEvent, QPrivateSignal) — за того, что виноват QPrivateSignal. Хотя понятия не имею, как это обойти.

Ответ №1:

Если вы можете использовать C 14, вы можете использовать вспомогательную функцию:

 template<class T> auto privateOverload(void ( QSocketNotifier::* s)( QSocketDescriptor,QSocketNotifier::Type,T ) ){return s;}
 

и тогда вы сможете использовать

 QObject::connect(socketNotifier, privateOverload(amp;QSocketNotifier::activated),/*...*/);
 

Если вы можете использовать C 20, вы также можете использовать лямбду непосредственно в инструкции connect:

 QObject::connect(socketNotifier, []<class T>(void ( QSocketNotifier::* s)( QSocketDescriptor,QSocketNotifier::Type,T ) ){return s;}(amp;QSocketNotifier::activated),/*...*/);