0

考虑以下最小示例:

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' 的名称更改为其他名称,以完全避免冲突。那里的问题是我怀疑我不应该这样做,在某些情况下我什至可能无法做到这一点(想象一下由彼此不知道的独立插件提供的两个结构)。

话虽如此,我有几个问题:

  1. 我尝试更改两个别名以包含命名空间限定符,例如qRegisterMetaType<foo::MyStruct>("foo::MyStruct"),但是 Qt 默默地表现得好像我根本没有注册元类型。这对我来说似乎是一个干净的解决方案。为什么不允许这样做?为什么我没有收到警告?

  2. 如果我对以前的方法进行修改并将别名更改为 , 或 之类的东西foo_MyStructfooMyStruct或者MyStruct2甚至不将任何别名传递给函数,这似乎也不起作用。别名参数是否必须存在并与符号名称完全匹配?

  3. 我还有什么其他选择?(没有重命名结构)

干杯!

4

0 回答 0