问题描述
考虑以下最小示例:
namespace foo { struct MyStruct {}; }
Q_DECLARE_MetaTYPE(foo::MyStruct)
namespace bar { struct MyStruct {}; }
Q_DECLARE_MetaTYPE(bar::MyStruct)
// later on near the entry point of the program:
qRegisterMetaType<foo::MyStruct>("MyStruct");
qRegisterMetaType<bar::MyStruct>("MyStruct");
此代码可能会导致崩溃。当调用接受 const foo::MyStruct&
作为参数的槽时,由于别名歧义,Qt 的元对象系统提供 const bar::MyStruct&
。
我知道显而易见的解决方法是将 MyStruct
的名称更改为其他名称以完全避免冲突。问题是我怀疑我不应该这样做,在某些情况下我什至可能无法做到这一点(想象一下由相互不了解的独立插件提供的两个结构).
话虽如此,我有几个问题:
-
我尝试更改两个别名以包含名称空间限定符,例如
qRegisterMetaType<foo::MyStruct>("foo::MyStruct")
,但 Qt 会默默地表现,好像我根本没有注册元类型。这对我来说似乎是一个干净的解决方案。为什么这是不允许的?为什么我没有收到警告? -
如果我对之前的方法做一些改动并将别名更改为
foo_MyStruct
、fooMyStruct
或MyStruct2
之类的东西,或者甚至不将任何别名传递给函数,这似乎也不起作用。别名参数是否必须存在并与符号名称完全匹配? -
我还有什么其他选择? (缺少重命名结构)
干杯!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)