2014-11-02 2 views
3

Я пытаюсь извлечь из строя различные типы данных.Преобразование строки в __uint128_t с использованием строковых потоков

void     readHeader(char buf[BUFFSIZE]) 
{ 
    std::istringstream hdr(buf); 
    __uint128_t   id_client; 

    hdr >> id_client; // doesn't compile 
} 

Я получаю эту ошибку, когда я делаю что hdr >> id_client:

Unix/UnixSocket.cpp:158:10: error: ambiguous overload for ‘operator>>’ in ‘hdr >> id_client’ Unix/UnixSocket.cpp:158:10: note: candidates are: In file included from /usr/include/c++/4.7/sstream:39:0, 
       from Unix/UnixSocket.cpp:11: /usr/include/c++/4.7/istream:118:7: note: std::basic_istream<_CharT, 
_Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, 
_Traits>::__istream_type = std::basic_istream<char>] <near match> /usr/include/c++/4.7/istream:118:7: note: no known conversion for argument 1 from ‘__int128 unsigned’ to ‘std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}’ /usr/include/c++/4.7/istream:122:7: note: std::basic_istream<_CharT, 
_Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, 
_Traits>::__istream_type = std::basic_istream<char>; std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] <near match> /usr/include/c++/4.7/istream:122:7: 

Есть ли способ, чтобы правильно хранить мои id_client в этой __uint128_t переменной?

+2

Поскольку тип не является стандартным типом, стандартная библиотека не поддерживает его. Вам необходимо проанализировать и преобразовать номер вручную. –

+0

Возможно, вы можете использовать 'uint128_t', если он поддерживается вашим компилятором. – justanothercoder

+0

@JoachimPileborg Я уверен, что он ищет дополнение к стандартной библиотеке от команды clang/gcc, поскольку они добавили этот тип в свои компиляторы. Это интересный вопрос, если его можно найти. –

ответ

1

https://gmplib.org/ может помочь. Класс mpz_class абстракции объекта gmpxx поддерживает операции ввода-вывода, а функция mpz_export (...) позволяет преобразовать результат в массив байтов. Если они превышают 16 байт, вы можете выбросить исключение или подать жалобу иначе. Не очень быстро, но я думаю, что быстро реализовать.

Смежные вопросы