考虑以下最小示例:
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&
作为参数的槽时,const bar::MyStruct&
由于别名不明确,Qt 的元对象系统会提供。
我知道显而易见的解决方法是将MyStruct
' 的名称更改为其他名称,以完全避免冲突。那里的问题是我怀疑我不应该这样做,在某些情况下我什至可能无法做到这一点(想象一下由彼此不知道的独立插件提供的两个结构)。
话虽如此,我有几个问题:
我尝试更改两个别名以包含命名空间限定符,例如
qRegisterMetaType<foo::MyStruct>("foo::MyStruct")
,但是 Qt 默默地表现得好像我根本没有注册元类型。这对我来说似乎是一个干净的解决方案。为什么不允许这样做?为什么我没有收到警告?如果我对以前的方法进行修改并将别名更改为 , 或 之类的东西
foo_MyStruct
,fooMyStruct
或者MyStruct2
甚至不将任何别名传递给函数,这似乎也不起作用。别名参数是否必须存在并与符号名称完全匹配?我还有什么其他选择?(没有重命名结构)
干杯!