标题:传入参数类型被莫名改变
作者:佐進0307
日期:2018-09-21 21:32
内容:
项目中需要用到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)' 未定义。
传入的参数capabilities明明是QDBusConnection::ConnectionCapabilities(用Q_DECLARE_FLAGS定义的)类型的,为什么就变成了
QFlags类型,而且无论是对capabilities用static_cast,还是c语言式强制类型转化都无法转化为
QDBusConnection::ConnectionCapabilities类型传过去。
然后我又试了
QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, 1);
这次没有显示错误
`QDBusMessagePrivate::fromDBusMessage(DBusMessage*, QFlags)' 未定义了。
但是却出现了错误
.. /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
#include
#include
int main(int argc, char *argv[])
{
DBusMessage *msg;
QDBusConnection::ConnectionCapabil ..
#1 [zzs0829 09-23 18:59]
QFlags是Qt框架中的枚举装饰类,扩展了枚举的一些操作符运算。所以,装饰过的枚举类型和原类型不是等价的。
我估计你调用的那个方法实际是fromDBusMessage(DBusMessage*,QDBusConnection::ConnectionCapability),所以QDBusConnection::ConnectionCapabilities capabilities定义就不对了,要改成QDBusConnection::ConnectionCapability capabilities。
#2 回 zzs0829 的帖子 [佐進0307 09-23 19:26]
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::ConnectionCapabilities capabilities当作QFlags类型了,但是为什么会这样?而且进行类型转换也行不通。
#3 [dbzhang800 09-25 11:02]
不存在参数变化一说,你用的宏本身就是这么定义的
#define Q_DECLARE_FLAGS(Flags, Enum)\
typedef QFlags Flags;
#4 [青空飞羽 09-25 15:11]
方法的原型为:
static QDBusMessage fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities);
应该这么用:
QDBusConnection:ConnectionCapabilities capabilities = QDBusConnection::UnixFileDescriptorPassing;
QDBusMessage message = QDBusMessagePrivate::fromDBusMessage(msg, capabilities );
#5 回 dbzhang800 的帖子 [佐進0307 09-25 20:06]
dbzhang800:不存在参数变化一说,你用的宏本身就是这么定义的
#define Q_DECLARE_FLAGS(Flags, Enum)\
typedef QFlags Flags; (2018-09-25 11:02)
但问题的关键是函数声明是
QDBusMessage QDBusMessagePrivate::fromDBusMessage(DBusMessage *dmsg, QDBusConnection::ConnectionCapabilities capabilities)
而不是
QDBusMessagePrivate::fromDBusMessage(DBusMessage*, QFlags)
这就导致无法调用这个函数了,强制类型转换也不行。