根据this的说法,如果为底层类型T
和U
定义了相同的运算符,则在optional<T>
和optional<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一样)。
发布于 2018-10-22 01:22:12
<
运算符必须位于it参数的任何关联命名空间中,即它必须位于命名空间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);
}
}
https://stackoverflow.com/questions/52917842
复制相似问题