I'm trying to decimal integers into Octal Strings recursively in C++. I have tried the following code with no success. The helper function to_string works good by itself. The problem seems to be in the recursive function call.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
string to_string(long num)
{
ostringstream os;
os << num;
return os.str();
}
string dec_2_oct(long dec)
{
if (dec == 0)
{
string s = "";
return s;
}
return dec_2_oct(dec / 8) + to_string(dec % 8);
}
int main() {
long dec;
cin >> dec;
string s;
s = dec_2_oct(dec);
cout << s;
}
I'm getting pretty nasty looking errors.
Compiling failed with exitcode 1, compiler output:
prog.cpp: In function 'std::__cxx11::string dec_2_oct(long int)':
prog.cpp:21:50: error: call of overloaded 'to_string(long int)' is ambiguous
return dec_2_oct(dec / 8) + to_string(dec % 8);
^
prog.cpp:6:8: note: candidate: std::__cxx11::string to_string(long int)
string to_string(long num)
^~~~~~~~~
In file included from /usr/include/c++/7/string:52:0,
from /usr/include/c++/7/bits/locale_classes.h:40,
from /usr/include/c++/7/bits/ios_base.h:41,
from /usr/include/c++/7/ios:42,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from prog.cpp:1:
/usr/include/c++/7/bits/basic_string.h:6264:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(long double)
to_string(long double __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6255:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(double)
to_string(double __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6246:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(float)
to_string(float __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6240:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(long long unsigned int)
to_string(unsigned long long __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6234:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(long long int)
to_string(long long __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6228:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(long unsigned int)
to_string(unsigned long __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6223:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(long int)
to_string(long __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6217:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(unsigned int)
to_string(unsigned __val)
^~~~~~~~~
/usr/include/c++/7/bits/basic_string.h:6212:3: note: candidate: std::__cxx11::string std::__cxx11::to_string(int)
to_string(int __val)
^~~~~~~~~
Any help would be appreciated!
Try to understand the error:
Compiling failed with exitcode 1, compiler output:
prog.cpp: In function 'std::__cxx11::string dec_2_oct(long int)':
prog.cpp:21:50: error: call of overloaded 'to_string(long int)' is ambiguous
return dec_2_oct(dec / 8) + to_string(dec % 8);
The keywords in the error are overloaded
, ambiguous
and of course the function itself.
When you understand the meanings of these words in C++ context, you will understand the reason for the error.
Then you can take one of the following approaches:
to_string
to something like
my_to_string
. This is the naive approach. std
namespace at global scope or even
function scope and follow the usage of std::function
from now on.