首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在命名空间和类中使用bitmask_operators.hpp

如何在命名空间和类中使用bitmask_operators.hpp
EN

Stack Overflow用户
提问于 2017-02-27 08:41:45
回答 1查看 532关注 0票数 0

我想使用C++11 enum class作为位域,并找到一个很好的方法这里

但是,如果我的枚举类声明不是在全局命名空间中,而是在自定义名称空间中或类的内部,那么我就坚持下去了。例如:

代码语言:javascript
复制
#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

这总是给我带来错误:

代码语言:javascript
复制
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时,这个问题就会产生,比如:

代码语言:javascript
复制
class MyclassGN {
public:
    enum class Ecgn {
        None = 0x00,
        Bit0 = 0x01,
        Bit1 = 0x02,
        Bit2 = 0x04,
        Bit3 = 0x08,
    };
    ENABLE_BIT_OPERATORS(Ecgn)
    explicit MyclassGN(Ecgn e_) {}
};

然后我发现了一个错误:

代码语言:javascript
复制
enclosing class of constexpr non-static member function 'bool MyclassGN::enable_bitmask_operators(MyclassGN::Ecgn)' is not a literal type

好的,我通过添加static关键字来修正这个问题:

代码语言:javascript
复制
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_) {}
};

但是,当我尝试使用位掩码运算符时,下一个问题就会出现,例如:

代码语言:javascript
复制
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;
};

我有个错误:

代码语言:javascript
复制
no match for 'operator|=' (operand types are 'MyclassGN::Ecgn' and 'MyclassGN::Ecgn')

显示错误位于这里的更新示例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-27 12:11:47

示例代码,基于Anthony Williams的bitmask_operators.hpp,并应用Jay的建议(constexpr函数而不是template<>结构)来修复名称空间问题,即定位这里

注意,当在类中声明enum类时,constexpr函数需要在前面加上friend关键字(正如dyp在下面的注释中所建议的)。示例:

代码语言:javascript
复制
class Myclass {
public:
    enum class E {
        None = 0x00,
        Bit0 = 0x01,
        Bit1 = 0x02,
        Bit2 = 0x04,
        Bit3 = 0x08,
    };
    friend ENABLE_BIT_OPERATORS(E)
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42481154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档