Оператор сравнения для std :: необязательный enum - PullRequest
0 голосов
/ 21 октября 2018

Согласно 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>')

Есть идеи?Я обнаружил, что, перемещая каждое перечисление из их пространств имен, все работает как положено (как здесь ).

1 Ответ

0 голосов
/ 21 октября 2018

Оператор < должен находиться в любом из связанных пространств имен его параметров, то есть он должен находиться либо в пространстве имен 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);
    }        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...