• 2191阅读
  • 8回复

[提问]传入参数类型被莫名改变 [复制链接]

上一主题 下一主题
离线佐進0307
 

只看楼主 倒序阅读 楼主  发表于: 2018-09-21
项目中需要用到libdbus库,于是需要将DBusMessage转化为QDbusMessage。 查阅Qt源代码,发现
    QDBusMessage QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
这个函数能实现这样的功能。
比照Qt的代码,自己是这样写的:
    DBusMessage *msg;
    QDBusConnection::ConnectionCapabilities capabilities = QDBusConnection::UnixFileDescriptorPassing;
    QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, QDBusConnection::UnixFileDescriptorPassing);
但是编译提示
    `QDBusMessagePrivate::fromDBusMessage(DBusMessage*, QFlags<QDBusConnection::ConnectionCapability>)' 未定义。
传入的参数capabilities明明是QDBusConnection::ConnectionCapabilities(用Q_DECLARE_FLAGS定义的)类型的,为什么就变成了
QFlags<QDBusConnection::ConnectionCapability>类型,而且无论是对capabilities用static_cast,还是c语言式强制类型转化都无法转化为
QDBusConnection::ConnectionCapabilities类型传过去。

然后我又试了
    QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, 1);
这次没有显示错误
  `QDBusMessagePrivate::fromDBusMessage(DBusMessage*, QFlags<QDBusConnection::ConnectionCapability>)' 未定义了。
但是却出现了错误
.. /main.cpp:17:71: error: invalid conversion from ‘int’ to ‘QDBusConnection::ConnectionCapability’ [-fpermissive]
     QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, 1);
说明QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities) 这个函数还是能调用的,但是为什么会出现传递的参数类型被改变了呢?
还望大家多多指教。

下面是一个MWE:
#include <private/dbusmessage_p.h>
#include <QApplication>
#include <QtDBus/QDusConnection>

int main(int argc, char *argv[])
{

    DBusMessage *msg;
    QDBusConnection::ConnectionCapabilities capabilities = QDBusConnection::UnixFileDescriptorPassing;
    QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, QDBusConnection::UnixFileDescriptorPassing);
    QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, 1);
    return 0;
}
需要链接dbus dbus-private。

補充:
QDBusConnection::ConnectionCapabilities的定義:

    enum ConnectionCapability {
        UnixFileDescriptorPassing = 0x0001
    };
    Q_DECLARE_FLAGS(ConnectionCapabilities, ConnectionCapability)



离线zzs0829

只看该作者 1楼 发表于: 2018-09-23
QFlags是Qt框架中的枚举装饰类,扩展了枚举的一些操作符运算。所以,装饰过的枚举类型和原类型不是等价的。
我估计你调用的那个方法实际是fromDBusMessage(DBusMessage*,QDBusConnection::ConnectionCapability),所以QDBusConnection::ConnectionCapabilities capabilities定义就不对了,要改成QDBusConnection::ConnectionCapability capabilities。
离线佐進0307

只看该作者 2楼 发表于: 2018-09-23
回 zzs0829 的帖子
zzs0829:
QFlags是Qt框架中的枚举装饰类,扩展了枚举的一些操作符运算。所以,装饰过的枚举类型和原类型不是等价的。
我估计你调用的那个方法实际是fromDBusMessage(DBusMessage*,QDBusConnection::ConnectionCapability),所以QDBusConnection::ConnectionCapabilities capabilities定义就不对了,要改成QDBusConnection::ConnectionCapability capabilities。

      QDBusMessage QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
是源码中的原型应该不会有错,我刚才也试了将capabilities定义为
        QDBusConnection::ConnectionCapability capabilities = QDBusConnection::UnixFileDescriptorPassing;
仍然编译错误, 提示:

      QDBusMessagePrivate::fromDBusMessage(DBusMessage*, QFlags<QDBusConnection::ConnectionCapability>) 未定义。
由此可见,编译器是将QDBusConnection::ConnectionCapabilities capabilities当作QFlags<QDBusConnection::ConnectionCapabilities>类型了,但是为什么会这样?而且进行类型转换也行不通。
离线dbzhang800

只看该作者 3楼 发表于: 2018-09-25
不存在参数变化一说,你用的宏本身就是这么定义的

#define Q_DECLARE_FLAGS(Flags, Enum)\
typedef QFlags<Enum> Flags;
离线青空飞羽

只看该作者 4楼 发表于: 2018-09-25
方法的原型为:
static QDBusMessage fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities);

应该这么用:
QDBusConnection:ConnectionCapabilities capabilities = QDBusConnection::UnixFileDescriptorPassing;
QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, capabilities );
离线佐進0307

只看该作者 5楼 发表于: 2018-09-25
回 dbzhang800 的帖子
dbzhang800:不存在参数变化一说,你用的宏本身就是这么定义的
#define Q_DECLARE_FLAGS(Flags, Enum)\
typedef QFlags<Enum> Flags; (2018-09-25 11:02) 

但问题的关键是函数声明是
    QDBusMessage QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
而不是
    QDBusMessagePrivate::fromDBusMessage(DBusMessage*, QFlags<QDBusConnection::ConnectionCapability>)
这就导致无法调用这个函数了,强制类型转换也不行。
离线佐進0307

只看该作者 6楼 发表于: 2018-09-25
回 青空飞羽 的帖子
青空飞羽:方法的原型为:
static QDBusMessage fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities);
应该这么用:
QDBusConnection:ConnectionCapabilities capabilities = QDBusConnection::UnixFileDescriptorPassing;
....... (2018-09-25 15:11) 

我最先就是这样调用的,一样的错误。
离线青空飞羽

只看该作者 7楼 发表于: 2018-09-26
回 佐進0307 的帖子
佐進0307:我最先就是这样调用的,一样的错误。 (2018-09-25 20:09) 

从你贴出来的代码来看,你这是这么用的吧,不一样的吧,
QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, QDBusConnection::UnixFileDescriptorPassing);
离线佐進0307

只看该作者 8楼 发表于: 2018-09-26
回 青空飞羽 的帖子
青空飞羽:从你贴出来的代码来看,你这是这么用的吧,不一样的吧,
QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, QDBusConnection::UnixFileDescriptorPassing); (2018-09-26 09:35) 

我是说原先写项目代码的时候,这里给出的只是示例代码。
另外我依稀记得就算这样写C++应该也能自动转换吧,我没测试,也许我记错了。
快速回复
限100 字节
 
上一个 下一个