[Interest] Odd new-style connect()/disconnect() error with Qt 5.5.0
Elvis Stansvik
elvstone at gmail.com
Wed Oct 14 20:04:54 CEST 2015
2015-10-14 19:50 GMT+02:00 Bob Hood <bhood2 at comcast.net>:
> I'm having an odd compiler error using the new-style connect() and
> disconnect() with a QTcpSocket object. I'm working under Linux with Qt 5.5.0
> and QtCreator. I built Qt 5.5.0 myself without modifications, and then built
> QtCreator against it.
>
> Given a QSharedPointer<QTcpSocket> called 'stream', the connect() code looks like:
>
> connect(stream.data(), &QTcpSocket::readyRead, this,
> &TCPChannel::slot_data_available);
> connect(stream.data(), &QTcpSocket::disconnected, this,
> &TCPChannel::slot_client_lost);
> connect(stream.data(), &QTcpSocket::stateChanged, this,
> &TCPChannel::slot_state_changed);
> connect(stream.data(), &QTcpSocket::error, this,
> &TCPChannel::slot_socket_error);
>
> The error occurs on the last line with QTcpSocket::error (none of the other
> lines create errors. My disconnect code looks like:
>
> disconnect(stream.data(), &QTcpSocket::readyRead, this,
> &TCPChannel::slot_data_available);
> disconnect(stream.data(), &QTcpSocket::disconnected, this,
> &TCPChannel::slot_client_lost);
> disconnect(stream.data(), &QTcpSocket::stateChanged, this,
> &TCPChannel::slot_state_changed);
> disconnect(stream.data(), &QTcpSocket::error, this,
> &TCPChannel::slot_socket_error);
>
> where a similar error occurs on the last line with QTcpSocket::error.
>
> The error for the connect() call states:
>
> ../../../Common/Source/Channel.cpp: In member function 'virtual void
> SPlay::TCPChannel::connect_channel()':
> ../../../Common/Source/Channel.cpp:104:90: error: no matching function for
> call to 'SPlay::TCPChannel::connect(QTcpSocket*, <unresolved overloaded
> function type>, SPlay::TCPChannel* const, void
> (SPlay::TCPChannel::*)(QAbstractSocket::SocketError))'
> result = connect(stream.data(), &QTcpSocket::error, this,
> &TCPChannel::slot_socket_error);
> ^
> and then later in the output:
>
> /usr/local/qt/5.5.0/64_dll/include/QtCore/qobject.h:254:13: note:
> template argument deduction/substitution failed:
> ../../../Common/Source/Channel.cpp:104:90: note: couldn't deduce
> template parameter 'Func1'
> result = connect(stream.data(), &QTcpSocket::error, this,
> &TCPChannel::slot_socket_error);
> ^
> ^
> and disconnect():
>
> ../../../Common/Source/Channel.cpp: In member function 'virtual void
> SPlay::TCPChannel::disconnect_channel()':
> ../../../Common/Source/Channel.cpp:115:85: error: no matching function for
> call to 'SPlay::TCPChannel::disconnect(QTcpSocket*, <unresolved overloaded
> function type>, SPlay::TCPChannel* const, void
> (SPlay::TCPChannel::*)(QAbstractSocket::SocketError))'
> disconnect(stream.data(), &QTcpSocket::error, this,
> &TCPChannel::slot_socket_error);
> ^
>
> "SPlay" is a namespace, and my slots (within that namespace) look like:
>
> protected slots:
> virtual void slot_data_available();
> virtual void slot_client_lost();
> void slot_state_changed(QAbstractSocket::SocketState state);
> void slot_socket_error(QAbstractSocket::SocketError error);
>
> I also tried substituting "QAbstractSocket" for "QTcpSocket" in the code, and
> that had no effect--same errors with different names.
>
> Any insights as to why only that single signal is giving me grief? I'm sure
> it's something obvious that I'm overlooking. This same code using the
> old-style connect works fine under Windows using Qt 5.5.0.
I believe it is because QAbstractSocket::error is an overloaded
function, so it is ambiguous in your connect/disconnect calls. It
needs to be statically casted :/ See e.g:
https://wiki.qt.io/New_Signal_Slot_Syntax#Overload
Cheers,
Elvis
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
More information about the Interest
mailing list