重载运算符|干扰Qt枚举常量

时间:2015-07-30 15:15:42

标签: c++ qt enums operator-overloading

我使用带范围的枚举创建了位标志,我重载operator |来组合值:

enum class PARAM_T : int {
    NONE = 0x0,
    INPUT = 0x01,
    OUTPUT = 0x02,
    OUTPUT_VECTOR = 0x04
};

inline PARAM_T operator | (PARAM_T lhs, PARAM_T rhs)
{
    using T = std::underlying_type_t<PARAM_T>;
    return (PARAM_T)(static_cast<T>(lhs) | static_cast<T>(rhs));
}

在我的项目的其他地方,我使用Qt小部件执行一些拖放操作,我使用operator |来组合一些命名常量:

Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);

这里的operator |与我的位标志无关,但由于某种原因,我的重载会破坏这行代码,给出以下错误:

error C2664: 'Qt::DropAction QDrag::exec(Qt::DropActions,Qt::DropAction)' : cannot convert argument 1 from 'int' to 'Qt::DropActions'

为什么编译器将Qt常量与我的重载匹配?它们是完全不同且不兼容的类型。

1 个答案:

答案 0 :(得分:0)

阅读有关标志的主题,我看到有反对使用枚举作为标志的论据,所以我将我的枚举更改为:

namespace PARAM {
    const int NONE =            0;
    const int INPUT =           1 << 0;
    const int OUTPUT_SCALAR =   1 << 1;
    const int OUTPUT_VECTOR =   1 << 2;
}

现在我可以使用operator |operator &等的默认实现,而不是我的重载,Qt再次开心。这更像是一种解决方法而不是答案;我仍然想知道编译器为什么使用我的重载来获取Qt常量。