std::optional 枚举的比较运算符
Comparison operator for std::optional enum
根据 this,在 optional<T>
和 optional<U>
上使用比较运算符应该可以工作,前提是为基础类型 T
和 U
。
我正在尝试使用在不同命名空间中定义的两个枚举的以下示例(实时代码 here),但无法弄清楚编译失败的原因:
#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)。
<
运算符必须位于其参数的任何关联命名空间中,即它必须位于命名空间 n1
或 n2
中,但由于 n2::tag
是在 n1::tag
的定义中不可见 您需要将运算符放在命名空间 n2
中或重新打开命名空间 n1
.
正在命名空间中定义运算符 n2
:
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
:
...
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);
}
}
根据 this,在 optional<T>
和 optional<U>
上使用比较运算符应该可以工作,前提是为基础类型 T
和 U
。
我正在尝试使用在不同命名空间中定义的两个枚举的以下示例(实时代码 here),但无法弄清楚编译失败的原因:
#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)。
<
运算符必须位于其参数的任何关联命名空间中,即它必须位于命名空间 n1
或 n2
中,但由于 n2::tag
是在 n1::tag
的定义中不可见 您需要将运算符放在命名空间 n2
中或重新打开命名空间 n1
.
正在命名空间中定义运算符 n2
:
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
:
...
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);
}
}