我已经在库中运行了这段代码很长一段时间:
MyClass::MyClass()
: QDialog()
{
// (...)
setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint );
// (...)
}
然后,在更改库的各个部分后,我突然收到此消息:
error C2664: 'QWidget::setWindowFlags': cannot convert parameter 1 from 'int' to 'Qt::WindowFlags'
显然它没有找到 | QFlags 类提供的运算符重载使得 | 的结果返回一个 int 而不是 QFlags 构造。
我知道我可以手动将结果投射到(Qt::WindowFlags)
并使其工作,但 QFlags 通常会使这种强制转换变得不必要。
知道什么样的改变会导致这种行为吗?
我包括<QtGui/QDialog>
这通常就足够了。包括<QtCore/QFlags>
不会改变行为。
Since 5.12.0 https://code.qt.io/cgit/qt/qtbase.git/tree/dist/changes-5.12.0/?h=v5.12.0#n138,这应该通过以下方式修复这次提交 https://code.qt.io/cgit/qt/qtbase.git/commit/src/corelib/global/qnamespace.h?id=e759d38d491d9044a0558b1d45911e3b4115e772:“在 Qt 命名空间中为该命名空间中的 QFlags 声明运算符|”。在 5.12.0 之前,Qt 过去常常将其枚举运算符放在全局命名空间中(请参阅q命名空间.h https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/global/qnamespace.h?id=add58edcdbd986e68cdd65a2a935b76d85d5b639#n1733)而不是在Qt
命名空间。
问题是,当当前命名空间中存在另一个匹配的运算符时,编译器不会搜索父范围 https://stackoverflow.com/questions/5195512/namespaces-and-operator-resolution。因此,一旦您为命名空间中的任何类型添加运算符重载,Qt 的重载就不会出现在匹配集中。ADL http://en.cppreference.com/w/cpp/language/adl通常用于解析在与类型相同的命名空间中声明的运算符,但如果运算符位于不同的命名空间中,则这不起作用。
对于 Qt 来说,真正的解决方案是将运算符放在与它们所操作的类型相同的命名空间中,他们在 5.12.0 中就是这样做的。如果您坚持使用以前的版本,您可以自己导入运算符:
using ::operator|;
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
请注意,这可能会产生意想不到的后果,因为您可能会在不应该使用的上下文中使用许多名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)