Амбигус оператора
От: Marty Пират  
Дата: 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 . Предыдущая версия .
Re: Амбигус оператора
От: night beast СССР  
Дата: 21.05.20 11:03
Оценка:
Здравствуйте, Marty, Вы писали:

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


M>

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]


M>Попробовал сделать минимально повторяющий проблему тест на ideone — https://ideone.com/Avb8lQ

M>В чем может быть проблема?

у тебя в проекте ошибка, и чтобы ее показать ты закинул на ideone работающий пример?
отличный план!
Отредактировано 21.05.2020 11:03 night beast . Предыдущая версия .
Re[2]: Амбигус оператора
От: Marty Пират  
Дата: 21.05.20 11:10
Оценка:
Здравствуйте, night beast, Вы писали:

NB>у тебя в проекте ошибка, и чтобы ее показать ты закинул на ideone работающий пример?

NB>отличный план!

Ну, я попытался проиллюстрировать проблему, может там что-то может вылезти, о чем я не в курсе, но другие в курсе.
Или лучше было бы вообще без всякого примера пост запилить?
Re[3]: Амбигус оператора
От: night beast СССР  
Дата: 21.05.20 11:15
Оценка:
Здравствуйте, Marty, Вы писали:

NB>>у тебя в проекте ошибка, и чтобы ее показать ты закинул на ideone работающий пример?

NB>>отличный план!

M>Ну, я попытался проиллюстрировать проблему, может там что-то может вылезти, о чем я не в курсе, но другие в курсе.

M>Или лучше было бы вообще без всякого примера пост запилить?

имхо, в таком виде пример бесполезен
возможно, у тебя в проекте у этих классов есть конструкторы, или операторы преобразования в енум/инт, но без исходников это все чистая телепатия.
Re[4]: Амбигус оператора
От: Marty Пират  
Дата: 21.05.20 11:18
Оценка:
Здравствуйте, night beast, Вы писали:


NB>имхо, в таком виде пример бесполезен

NB>возможно, у тебя в проекте у этих классов есть конструкторы, или операторы преобразования в енум/инт, но без исходников это все чистая телепатия.

Нету. В структуре полей побольше, есть строки, и compare чутка посложнее. Еще есть метод toString, и всё. Конструкторов/деструкторов и операторов преобразования нету
Re[2]: Амбигус оператора
От: Marty Пират  
Дата: 21.05.20 11:49
Оценка:
Здравствуйте, night beast, Вы писали:

NB>у тебя в проекте ошибка, и чтобы ее показать ты закинул на ideone работающий пример?

NB>отличный план!

Проверил на MSVC 2017 — то, что на ideone — в нем не работает
Re[3]: Амбигус оператора
От: night beast СССР  
Дата: 21.05.20 12:00
Оценка: +1
Здравствуйте, Marty, Вы писали:

NB>>у тебя в проекте ошибка, и чтобы ее показать ты закинул на ideone работающий пример?

NB>>отличный план!

M>Проверил на MSVC 2017 — то, что на ideone — в нем не работает


у меня работает, на msvc что на https://gcc.godbolt.org тоже
Re[4]: Амбигус оператора
От: Marty Пират  
Дата: 21.05.20 13:43
Оценка:
Здравствуйте, night beast, Вы писали:

NB>>>у тебя в проекте ошибка, и чтобы ее показать ты закинул на ideone работающий пример?

NB>>>отличный план!

M>>Проверил на MSVC 2017 — то, что на ideone — в нем не работает


NB>у меня работает, на msvc что на https://gcc.godbolt.org тоже


Сорян, у меня в настройках стоит tooset v14 (MSVC 2015).
На готболте поставил его — работать перестало
Re[5]: Амбигус оператора
От: night beast СССР  
Дата: 21.05.20 13:54
Оценка:
Здравствуйте, Marty, Вы писали:

M>Сорян, у меня в настройках стоит tooset v14 (MSVC 2015).

M>На готболте поставил его — работать перестало

если закоментировать все операторы сравнения, то компилирует нормально.
видимо, считает твой енум обычным интом.
Re[6]: Амбигус оператора
От: Marty Пират  
Дата: 21.05.20 13:59
Оценка:
Здравствуйте, night beast, Вы писали:


M>>Сорян, у меня в настройках стоит tooset v14 (MSVC 2015).

M>>На готболте поставил его — работать перестало

NB>если закоментировать все операторы сравнения, то компилирует нормально.

NB>видимо, считает твой енум обычным интом.

Это без операторов видимо начинает его считать обычным интом. Я бы понял, если бы он с операторами дургого энама спутал, но у меня оператор для структуры. В общем, похоже глюк компилера
Re[7]: Амбигус оператора
От: night beast СССР  
Дата: 21.05.20 14:01
Оценка:
Здравствуйте, Marty, Вы писали:

NB>>если закоментировать все операторы сравнения, то компилирует нормально.

NB>>видимо, считает твой енум обычным интом.

M>Это без операторов видимо начинает его считать обычным интом. Я бы понял, если бы он с операторами дургого энама спутал, но у меня оператор для структуры. В общем, похоже глюк компилера


твой оператор структуры вообще не при делах. закоментируй его, ошибка останется.
Re[8]: Амбигус оператора
От: Marty Пират  
Дата: 21.05.20 14:08
Оценка:
Здравствуйте, night beast, Вы писали:


M>>Это без операторов видимо начинает его считать обычным интом. Я бы понял, если бы он с операторами дургого энама спутал, но у меня оператор для структуры. В общем, похоже глюк компилера


NB>твой оператор структуры вообще не при делах. закоментируй его, ошибка останется.


Да, ты прав. Похоже неопределенность возникала со встроенным оператором для инта, но компилятор его стыдливо не показывал при выводе сообщения об ошибке
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.