What is mean this convert?

时间:2016-06-18 20:26:09

标签: c++ qt

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?

2 个答案:

答案 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)));