我最近刚刚在 Qt 项目中的 ui 窗体中添加了一个 QLabel,将其文本对齐方式设置为自定义值,然后惊讶地发现 ui 类的自动生成代码导致了 MSVC 中的编译错误:
ui_projectwidget.h:109:
error: C2664: 'void QLabel::setAlignment(Qt::Alignment)' : cannot convert argument 1 from 'int' to 'Qt::Alignment'
Qt::Alignment
是表示左/右/居中等的标志。文字的理由。 ui_projectwidget.h 中有问题的行是:
componentName->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);
在这个项目中,我为范围枚举重载了operator |
,MIBC::ItemType
,它与Qt组件无关:
using FlagType = int64_t;
enum class ItemType: FlagType {
type1, type2, etc
}
using Ty = std::underlying_type_t<MIBC::ItemType>;
inline MIBC::ItemType operator| (MIBC::ItemType lhs, MIBC::ItemType rhs) {
return static_cast<MIBC::ItemType>(static_cast<Ty>(lhs) | static_cast<Ty>(rhs));
}
我能够通过为 Qt::AlignmentFlag 的 operator |
添加另一个重载来修复编译器错误:
inline Qt::AlignmentFlag operator|(Qt::AlignmentFlag lhs, Qt::AlignmentFlag rhs) {
return static_cast<Qt::AlignmentFlag>(static_cast<int>(lhs) | static_cast<int>(rhs));
}
即使我已经“解决”了这个问题,我还是不明白。是什么破坏了默认的 operator |
,以至于它不再接受 Qt::AlignmentFlag
?我是否应该以某种方式重组我的作用域枚举,使其不干扰其他按位或运算符?
最佳答案
很可能,您在全局命名空间中声明了运算符,从而破坏了 argument dependent lookup .相反,您应该将它放在其参数的命名空间中,然后让 ADL 提取它。
关于c++ - Qt 项目中损坏的按位或运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39919142/