Re: Амбигус оператор
От: Chorkov Россия  
Дата: 14.04.25 07:24
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Переопределил operator<< для своего потока, для всех std::intN_t/uintN_t


M>При выводе unsigned long говорит, что оператор амбигус: "error C2593: 'operator <<' is ambiguous", и перечисляет все int* перегрузки, и ни одна ему не нравится больше других


M>Глянул, как они определены в MSVC

M>
M>typedef signed char        int8_t;
M>typedef short              int16_t;
M>typedef int                int32_t;
M>typedef long long          int64_t;
M>typedef unsigned char      uint8_t;
M>typedef unsigned short     uint16_t;
M>typedef unsigned int       uint32_t;
M>typedef unsigned long long uint64_t;
M>


M>Как видно, unsigned long тут нет. Можно было бы добавить перегрузку для unsigned long, но в другом компиляторе может быть всё по другому, и unsigned long уже будет в этом списке. Как тут быть?


M>Можно шаблон конечно сделать для целых типов, но пока хотелось бы решить без этого


Правильный список типов для перекрывания:
https://godbolt.org/z/YrhYcjKaY
struct S {
    S& operator<<(char              ) { std::cout<<"char              "<<std::endl; return *this; }
    S& operator<<(signed char       ) { std::cout<<"signed char       "<<std::endl; return *this; }
    S& operator<<(unsigned char     ) { std::cout<<"unsigned char     "<<std::endl; return *this; }
    S& operator<<(signed short      ) { std::cout<<"signed short      "<<std::endl; return *this; }
    S& operator<<(signed int        ) { std::cout<<"signed int        "<<std::endl; return *this; }
    S& operator<<(signed long       ) { std::cout<<"signed long       "<<std::endl; return *this; }
    S& operator<<(signed long long  ) { std::cout<<"signed long long  "<<std::endl; return *this; }
    S& operator<<(unsigned short    ) { std::cout<<"unsigned short    "<<std::endl; return *this; }
    S& operator<<(unsigned int      ) { std::cout<<"unsigned int      "<<std::endl; return *this; }
    S& operator<<(unsigned long     ) { std::cout<<"unsigned long     "<<std::endl; return *this; }
    S& operator<<(unsigned long long) { std::cout<<"unsigned long long"<<std::endl; return *this; }


Суть: типы short и int (char и short, int и long, long и long long) могут иметь одинаковый размер, оставаясь разными типами. Тяжкое наследие Си.
Типы с фиксированным размером (std::intXX_t), ссылаются на один из этих типов.
Можно представить, что компилятор будет поддерживать какой-то специальный __int64_t, и std::int64_t ссылается на него, но я такого не встречал.
Отредактировано 14.04.2025 7:51 Chorkov . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.