I want to check if the length of 2 strings differ by more than 2. This is what I wrote.
#include <cmath>
#include <string>
if (abs(str1.size() - str2.size()) >= 2)
return false;
Compiler error:
1-5.cpp:8:9: error: call to 'abs' is ambiguous
if (abs(str1.size() - str2.size()) >= 2)
^~~
/Applications/Xcode.app/Contents/Develop
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/stdlib.h:129:6: note:
candidate function
int abs(int) __pure2;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib:167:44: note:
candidate function
inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) _NOEXCEPT {return labs(__x);}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib:169:44: note:
candidate function
inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:664:1: note:
candidate function
abs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:668:1: note:
candidate function
abs(double __lcpp_x) _NOEXCEPT {return fabs(__lcpp_x);}
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:672:1: note:
candidate function
abs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
^
1 error generated.
Unable to solve the problem, I changed the if statement to,
if (str1.size() - str2.size() >= 2 || str1.size() - str2.size() <= -2)
return false;
Even this statement does not seem to be working correctly. No matter what strings I input, the if statement always returns false.
The ambiguous call1 is not the real problem here: std::string::size
returns a std::size_t
, which is an unsigned integer types, so:
str1.size() - str2.size()
Will always be positive or zero (a negative value would be "wrapped" around by arithmetic modulo 2n, so you will get an enormous number instead of a negative one).
You need to change the way you compare the sizes:
if (str1.size() > str2.size() + 2 || str2.size() > str1.size() + 2) {
// Do whatever you want
}
Note: With the code you gave, clang
warns you about this (in a sense):
warning: taking the absolute value of unsigned type 'unsigned long' has no effect [-Wabsolute-value]
1 There is an ambiguous call here for abs
because std::size_t
is unsigned and there is no abs
for unsigned integer types (why would you want the absolute value of something that is always positive?), so you need a conversion from this unsigned integer type to either int
, long
or long long
which makes the call ambiguous.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With