c++ - Qt 项目中损坏的按位或运算符

标签 c++ qt

我最近刚刚在 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/

相关文章:

qt - 如何使用打过补丁的qt安装wkhtmltopdf?

c++ - 将 remove_if 变成 remove_not_if

c++ - 父类(super class)和子类,不同的函数调用取决于子类

c++ - FANN XOR 训练

c++ - RapidXml:无法从 XML 文件中获取子项

xml - QtCreator 模板向导 : skipping dashes in %ProjectName% variable

c++ - Qt C++ 析构函数需要很长时间才能返回

c++ - 复制和直接初始化行为不同的动机是什么?

c++ - QObject::sender() 在插槽中无法正常工作

qt - 拦截Tab键按下可手动管理焦点切换