gpt4 book ai didi

c++ - QFlags 枚举类型转换突然失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:01 25 4
gpt4 key购买 nike

我已经在库中运行了这段代码很长一段时间:

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>不会改变行为。

最佳答案

5.12.0 , 这应该由 this commit 修复:“在 Qt 命名空间中为该命名空间中的 QFlags 声明运算符|”。在 5.12.0 之前,Qt 过去常常将其枚举运算符放在全局命名空间中(请参阅 qnamespace.h),而不是放在 Qt 命名空间中。

问题是当当前命名空间中有另一个匹配的运算符时,编译器will not search the parent scopes .因此,只要您为 namespace 中的任何类型添加运算符重载,Qt 的重载就不会出现在匹配集中。 ADL通常用于解析在与类型相同的 namespace 中声明的运算符,但如果运算符位于不同的 namespace 中,则这不起作用。

对于 Qt 来说,真正的解决方案是将运算符放在与它们所操作的类型相同的命名空间中,他们在 5.12.0 中就是这样做的。如果您坚持使用以前的版本,您可以自己导入运算符:

using ::operator|;
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);

请注意,这可能会产生意想不到的后果,因为您可能会在不应该使用的上下文中提供大量名称。

关于c++ - QFlags 枚举类型转换突然失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10755058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com