我已经在库中运行了这段代码很长一段时间了:
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>不改变行为.
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)
请注意,这可能会产生意想不到的后果,因为您可能会在不应该出现的情况下提供大量名称.
2 ADL通常用于解析在与该类型相同的命名空间中声明的运算符,但如果运算符位于不同的命名空间中,则这不起作用.
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |