Амбигус оператора
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 21.05.20 10:54
Оценка:
Здравствуйте!

В проекте MSVC 2017 не может выбрать соответствующий оператор сравнения — говорит, что:

1>error C2593: 'operator <' is ambiguous
1>note: could be 'bool test::operator <(test::EntryType,test::EntryType)' [found using argument-dependent lookup]
1>note: or 'bool test::operator <(test::SomeInfo,test::SomeInfo)' [found using argument-dependent lookup]
note: while trying to match the argument list '(test::EntryType, test::EntryType)'


Попробовал сделать минимально повторяющий проблему тест на ideone — https://ideone.com/Avb8lQ
Тест — работает, в проекте — не работает. Вроде все один к одному перенес, даже ошибку в методе int compare( const StructTest s ) перенес — там должна быть ссылка.
В чем может быть проблема?
Вроде сигнатура первого оператора в точности соответствует тому, что он ищет. Ну, по крайней мере, если судить по сообщениям

UPD Попробовал на MSVC собрать приведенный пример — не собирвается. Получается, что есть какая-то проблема с MSVC 2017.

  Если лень лезть на ideone
#include <iostream>
using namespace std;


namespace test
{

struct StructTest
{
    int i;

    int compare( const StructTest s )
    {
        if (i<s.i)      return -1;
        else if (i>s.i) return  1;
        else            return  0;
    }

}; 

bool operator<( StructTest t1, StructTest t2 )
{
    return t1.compare(t2) < 0;
}


enum class EnumTest
{
    e1, e2, e3
};

namespace utils {

inline int compare( EnumTest e1, EnumTest e2 )
{
    unsigned u1 = (unsigned)e1;
    unsigned u2 = (unsigned)e2;

    if (u1<u2)      return -1;
    else if (u1>u2) return  1;
    else            return  0;
}

} // namespace utils

inline bool operator< ( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) <  0; }
inline bool operator<=( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) <= 0; }
inline bool operator> ( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) >  0; }
inline bool operator>=( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) >= 0; }
inline bool operator==( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) == 0; }
inline bool operator!=( EnumTest e1, EnumTest e2 ) { return utils::compare( e1, e2 ) != 0; }

struct SomeOther
{
    EnumTest e;
};

} // namespace test


int main( int argc, char * argv[])
{
    test::SomeOther so1 = { test::EnumTest::e1 };
    test::SomeOther so2 = { test::EnumTest::e2 };

    if (so1.e<so2.e)
        cout<<"so1.e<so2.e\n";
    else
        cout<<"so1.e<so2.e\n";

    return 0;

}
Маньяк Робокряк колесит по городу
Отредактировано 21.05.2020 11:48 Marty . Предыдущая версия . Еще …
Отредактировано 21.05.2020 11:09 Marty . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.