QMetaType 混淆名称相同但命名空间不同的两个符号

问题描述

考虑以下最小示例:

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

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

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

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

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

干杯!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)