Согласно this , использование оператора сравнения на optional<T>
и optional<U>
должно работать при условии, что один и тот же оператор определен для базовых типов T
и U
.
Я пробую следующий пример с двумя перечислениями, определенными в разных пространствах имен (действующий код здесь ), и не могу понять, почему он не компилируется:
#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>')
Есть идеи?Я обнаружил, что, перемещая каждое перечисление из их пространств имен, все работает как положено (как здесь ).