首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::可选枚举的比较运算符

std::可选枚举的比较运算符
EN

Stack Overflow用户
提问于 2018-10-22 01:09:49
回答 1查看 213关注 0票数 1

根据this的说法,如果为底层类型TU定义了相同的运算符,则在optional<T>optional<U>上使用比较运算符应该是有效的。

我正在使用定义在不同名称空间(活动代码here)中的两个枚举来尝试下面的示例,但我不明白为什么它无法编译:

代码语言:javascript
复制
#include <optional>

namespace n1
{
    enum class tag : unsigned {I,II,III};
}

namespace n2
{
    enum class tag : unsigned {I,II,III};
}

bool operator<(const n1::tag& t1, const n2::tag& t2)
{
    return static_cast<unsigned>(t1) < static_cast<unsigned>(t2);
}

int main()
{
    const std::optional<n1::tag> o1(n1::tag::I);
    const std::optional<n2::tag> o2(n2::tag::I);
    bool t = (o1 < o2);
}

我的GCC-8.2.0说:

invalid operands to binary expression ('const std::optional<n1::tag>' and 'const std::optional<n2::tag>')

有什么想法吗?我发现把每个枚举移出它们的命名空间,事情就像预期的那样工作(就像here一样)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-22 01:22:12

<运算符必须位于it参数的任何关联命名空间中,即它必须位于命名空间n1n2中,但由于n2::tagn1::tag的定义中不可见,因此需要将运算符放置在命名空间n2中或重新打开命名空间n1

在命名空间n2中定义运算符

代码语言:javascript
复制
namespace n2
{
    enum class tag : unsigned {I,II,III};
    bool operator<(const n1::tag& t1, const n2::tag& t2)
    {
        return static_cast<unsigned>(t1) < static_cast<unsigned>(t2);
    }    
}

打开命名空间n1

代码语言:javascript
复制
...

namespace n2
{
    enum class tag : unsigned {I,II,III};
}
namespace n1 {
    bool operator<(const n1::tag& t1, const n2::tag& t2)
    {
        return static_cast<unsigned>(t1) < static_cast<unsigned>(t2);
    }        
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52917842

复制
相关文章

相似问题

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