integer
integer copied to clipboard
Ambiguity
I'm getting an ambiguity with clang. This is actually on a fork I made to prepare for shared library visibility stuff:
+ /usr/bin/clang++ -c -std=c++14 -D_POSIX -w -fno-common -fvisibility=hidden
-fno-strict-aliasing -fomit-frame-pointer -Ibuild/release/share/src/integer
-DFLX_STATIC_LINK -Wfatal-errors -Wno-invalid-offsetof -Wno-parentheses -o build/release/obj/host/lib/rtl/flx_integer_static/build/release/share/src/integer/integer_static.o -MMD -MF /var/folders/km/g22y_d_j311d44xbkz5x4lww0000gn/T/tmp0tp6pja9/temp
build/release/share/src/integer/integer.cpp
build/release/share/src/integer/integer.cpp:222:31: fatal error: conversion
from 'const integer' to 'const integer::REP_SIZE_T' (aka 'const unsigned long')
is ambiguous
const integer::REP_SIZE_T max_bits = std::max(bits(), rhs.bits());
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/release/share/src/integer/integer.include:159:9: note: candidate function
operator bool() const;
^
build/release/share/src/integer/integer.include:160:9: note: candidate function
operator uint8_t() const;
^
build/release/share/src/integer/integer.include:161:9: note: candidate function
operator uint16_t() const;
^
build/release/share/src/integer/integer.include:162:9: note: candidate function
operator uint32_t() const;
^
build/release/share/src/integer/integer.include:163:9: note: candidate function
operator uint64_t() const;
^
build/release/share/src/integer/integer.include:164:9: note: candidate function
operator int8_t() const;
^
build/release/share/src/integer/integer.include:165:9: note: candidate function
operator int16_t() const;
^
build/release/share/src/integer/integer.include:166:9: note: candidate function
operator int32_t() const;
^
build/release/share/src/integer/integer.include:167:9: note: candidate function
operator int64_t() const;
^```
BTW: I think that should be REP_SIZE_T. If I change it though I get this:
build/release/share/src/integer/integer.cpp:381:31:
fatal error: conversion from 'integer' to
'std::__1::deque<unsigned char, std::__1::allocator<unsigned char> >::size_type'
(aka 'unsigned long') is ambiguous
out.insert(out.end(), whole - 1, 0);
The issue is:
const integer & whole = qr.first; // number of zeros to add to the back
and that really does have to be an integer (because one could be shifting a lot of bits). Although I have no idea what would happen if you shifted more than uint64_t bits because the underlying array would then be larger than memory on a 64 bit machine .... So I guess a conversion from integer to REP_T is probably safe ..