I develop with QtFramework in c++. I encountered this converting method that is static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>
(&QAbstractSocket::error)
. But I have not understand what is it mean?
答案 0 :(得分:2)
QTcpSocket 继承自基类 QAbstractSocket 。 QAbstractSocket中有方法SocketError error()
和信号void error(QAbstractSocket::SocketError socketError)
,即名称相同。
在存在重载的情况下,函数名称的地址本身是不明确的。您可以使用static_cast<>()
根据函数指针类型隐含的函数签名指定要使用的函数。
您的问题中的强制转换选择信号,因为void (QTcpSocket::*)(QAbstractSocket::SocketError)
是指向QTcpSocket中的函数类型的指针,该函数返回void
并获取参数QAbstractSocket::SocketError
。
例如,要使用函数指针语法连接到QAbstractSocket::error
信号,必须在静态强制转换中指定信号类型。
答案 1 :(得分:1)
static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)> (&QAbstractSocket::error)
其中:
&QAbstractSocket::error
- 是名为error(...)
;
它将它转换为void (QTcpSocket::*)(QAbstractSocket::SocketError)
- 这是一个指向成员(QTcpSocket)函数的指针,它接受参数QAbstractSocket::SocketError
并返回void
。
所以我们从作为QAbstractSocket(可能是基类)成员的函数的地址转换为函数指针,该函数指针是QTcpSocket的成员(可能是派生类)。
注意强>
由于talamaki非常清楚地解释了这个原因(即在连接期间选择正确的函数(...);另一种方法是使用较旧的Qt connect()样式,您可以明确地选择正确的函数。如果你弄错了会丢失编译时错误的成本。我经常认为这更清楚(例如,这个问题可能不需要问)。这是一个例子:
// Here we can explicitly choose the correct function,
// and its clear to any reader what is going on.
connect(pTcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(errorHandler(QAbstractSocket::SocketError)));