QFlags枚举类型转换突然失败

Tim*_*yer 5 c++ qt qt4 qt4.7

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

MyClass::MyClass() 
  : QDialog()
{
    // (...)
    setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint );
    // (...)
}
Run Code Online (Sandbox Code Playgroud)

然后,在更改了库的各个部分之后,我突然得到了这个消息:

error C2664: 'QWidget::setWindowFlags': cannot convert parameter 1 from 'int' to 'Qt::WindowFlags'
Run Code Online (Sandbox Code Playgroud)

显然它没有找到| QFlags类提供的运算符重载使得|的结果 返回一个int而不是一个QFlags结构.

我知道我可以手动将结果转换为(Qt::WindowFlags)并使其工作,但QFlags通常会使这种类型的转换不必要.

知道什么样的改变会导致这种行为吗?

我包括<QtGui/QDialog>哪些通常就足够了.包括<QtCore/QFlags>不改变行为.

isa*_*nae 5

Qt将其枚举运算符放在全局命名空间1而不是Qt命名空间中.如果在当前名称空间中存在另一个匹配的运算符,则编译器将不会搜索父作用域.只要在命名空间中为操作符添加重载,Qt的重载就不会出现在匹配集中.2

Fèlix的答案也无效,因为它需要两次隐式转换:Qt- > Qt- > Qt.由于长期存在的错误, Visual C++会接受它,但大多数编译器会拒绝它:

using ::operator|;
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
Run Code Online (Sandbox Code Playgroud)

这适用于所有编译器:

using ::operator|;
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
Run Code Online (Sandbox Code Playgroud)

因为只需要一次转换:Qt- > Qt.

真正的解决方案是让Qt将运算符放在与它们运行的​​类型相同的命名空间中.在此期间,您可以自己导入运算符:

using ::operator|;
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint);
Run Code Online (Sandbox Code Playgroud)

请注意,这可能会产生意想不到的后果,因为您可能会在不应该出现的情况下提供大量名称.

1 1733行的结束括号Qt是在第58行打开的结束.

2 ADL通常用于解析在与该类型相同的命名空间中声明的运算符,但如果运算符位于不同的命名空间中,则这不起作用.