J
John Doe
If I include <cmath> and write std::abs in my program I get:
gcc -MD -o /home/bla/c++/.build/generator.o -c
generator.cpp
generator.cpp: In function 'int main(int, char**)':
generator.cpp:206: error: call of overloaded 'abs(unsigned int)' is
ambiguous
/usr/include/gentoo-multilib/amd64/stdlib.h:786: note: candidates are:
int abs(int)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cstdlib:143: note:
long int std::abs(long int)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cstdlib:173: note:
long long int __gnu_cxx::abs(long long int)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cmath:90: note:
double std::abs(double)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cmath:94: note:
float std::abs(float)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cmath:98: note:
long double std::abs(long double)
make: *** [/home/bla/c++/.build/generator.o] Error 1
The problem is there is no templated std::abs(), like there is
std::max(). Do I do:
template <class T>
T abs(T const& in)
{
return std::max(-in, in);
}
or something like that? Maybe there's a more beautiful solution? Perhaps
there's something in boost?
gcc -MD -o /home/bla/c++/.build/generator.o -c
generator.cpp
generator.cpp: In function 'int main(int, char**)':
generator.cpp:206: error: call of overloaded 'abs(unsigned int)' is
ambiguous
/usr/include/gentoo-multilib/amd64/stdlib.h:786: note: candidates are:
int abs(int)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cstdlib:143: note:
long int std::abs(long int)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cstdlib:173: note:
long long int __gnu_cxx::abs(long long int)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cmath:90: note:
double std::abs(double)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cmath:94: note:
float std::abs(float)
/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.1/include/g++-v4/cmath:98: note:
long double std::abs(long double)
make: *** [/home/bla/c++/.build/generator.o] Error 1
The problem is there is no templated std::abs(), like there is
std::max(). Do I do:
template <class T>
T abs(T const& in)
{
return std::max(-in, in);
}
or something like that? Maybe there's a more beautiful solution? Perhaps
there's something in boost?