我想使用C++11 enum class作为位域,并找到一个很好的方法这里。
但是,如果我的枚举类声明不是在全局命名空间中,而是在自定义名称空间中或类的内部,那么我就坚持下去了。例如:
#define ENABLE_BIT_OPERATORS(E) template<> struct enable_bitmask_operators<E> { static constexpr bool enable=true; };
// anonymous namespace
namespace {
enum class Ean {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ean)
} // anonymous namespace
// custom namespace
namespace Custom {
enum class Ecn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecn)
} // custom namespace
// inside class in global namespace
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
};
// inside class in anonymous namespace
namespace {
class MyclassAN {
public:
enum class Ecan {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecan)
};
} // anonymous namespace
// inside class in custom namespace
namespace Custom {
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
};
} // custom namespace这总是给我带来错误:
error: specialization of 'template<class E> struct enable_bitmask_operators' in different namespace在我将模板专门化设置到与enable_bitmask_operators中的模板bitmask_operators.hpp定位相同的名称空间之前(本例中为全局命名空间)。
但是我想让我的专长接近我的枚举类声明。
在提到的文章中,Jay也对这个问题进行了评论,似乎他提供了一个解决方案。但我没有按照他的提示在bitmask_operators.hpp中解决这个问题。
示例代码这里。
编辑/部分解决:i,同时,我让它工作(只是一个转储复制粘贴问题和神秘的错误消息;-)。我刚刚通过应用Jay函数解决方案更新了我的示例代码。
但是,在类的内部声明枚举类时仍然存在问题。当我在类中添加一个ctor时,这个问题就会产生,比如:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_) {}
};然后我发现了一个错误:
enclosing class of constexpr non-static member function 'bool MyclassGN::enable_bitmask_operators(MyclassGN::Ecgn)' is not a literal type好的,我通过添加static关键字来修正这个问题:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
static ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_) {}
};但是,当我尝试使用位掩码运算符时,下一个问题就会出现,例如:
class MyclassGN {
public:
enum class Ecgn {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
static ENABLE_BIT_OPERATORS(Ecgn)
explicit MyclassGN(Ecgn e_): e(e_) {
e |= Ecgn::Bit3;
}
private:
Ecgn e;
};我有个错误:
no match for 'operator|=' (operand types are 'MyclassGN::Ecgn' and 'MyclassGN::Ecgn')显示错误位于这里的更新示例。
发布于 2017-02-27 12:11:47
示例代码,基于Anthony Williams的bitmask_operators.hpp,并应用Jay的建议(constexpr函数而不是template<>结构)来修复名称空间问题,即定位这里。
注意,当在类中声明enum类时,constexpr函数需要在前面加上friend关键字(正如dyp在下面的注释中所建议的)。示例:
class Myclass {
public:
enum class E {
None = 0x00,
Bit0 = 0x01,
Bit1 = 0x02,
Bit2 = 0x04,
Bit3 = 0x08,
};
friend ENABLE_BIT_OPERATORS(E)
};https://stackoverflow.com/questions/42481154
复制相似问题