Сообщение Re: Амбигус оператор от 14.04.2025 7:24
Изменено 14.04.2025 7:51 Chorkov
Re: Амбигус оператор
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Переопределил operator<< для своего потока, для всех std::intN_t/uintN_t
M>При выводе unsigned long говорит, что оператор амбигус: "error C2593: 'operator <<' is ambiguous", и перечисляет все int* перегрузки, и ни одна ему не нравится больше других
M>Глянул, как они определены в MSVC
M>
M>Как видно, unsigned long тут нет. Можно было бы добавить перегрузку для unsigned long, но в другом компиляторе может быть всё по другому, и unsigned long уже будет в этом списке. Как тут быть?
M>Можно шаблон конечно сделать для целых типов, но пока хотелось бы решить без этого
Правильный список типов для перекрывания:
https://godbolt.org/z/YrhYcjKaY
Суть: типы short и int (char и short, int и long, long и long long) могут иметь одинаковый размет, оставаясь разными типами. Тяжкое наследие Си.
Типы с фиксированным размером (std::intXX_t), ссылаются на один из этих типов.
Можно представить, что компилятор будет поддерживать какой-то специальный __int64_t, и std::int64_t ссылается на него, но я такого не встречал.
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 ссылается на него, но я такого не встречал.
Re: Амбигус оператор
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Переопределил operator<< для своего потока, для всех std::intN_t/uintN_t
M>При выводе unsigned long говорит, что оператор амбигус: "error C2593: 'operator <<' is ambiguous", и перечисляет все int* перегрузки, и ни одна ему не нравится больше других
M>Глянул, как они определены в MSVC
M>
M>Как видно, unsigned long тут нет. Можно было бы добавить перегрузку для unsigned long, но в другом компиляторе может быть всё по другому, и unsigned long уже будет в этом списке. Как тут быть?
M>Можно шаблон конечно сделать для целых типов, но пока хотелось бы решить без этого
Правильный список типов для перекрывания:
https://godbolt.org/z/YrhYcjKaY
Суть: типы short и int (char и short, int и long, long и long long) могут иметь одинаковый размер, оставаясь разными типами. Тяжкое наследие Си.
Типы с фиксированным размером (std::intXX_t), ссылаются на один из этих типов.
Можно представить, что компилятор будет поддерживать какой-то специальный __int64_t, и std::int64_t ссылается на него, но я такого не встречал.
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 ссылается на него, но я такого не встречал.