在 C++ 中递归地从十进制到八进制。以 std::string 格式输出

Decimal to Octal recursively in C++. Output in std::string format

我正在尝试在 C++ 中递归地将十进制整数转换为八进制字符串。我尝试了以下代码但没有成功。辅助函数 to_string 本身就很好用。问题似乎出在递归函数调用上。

#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;
}

我遇到了一些看起来很讨厌的错误。

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)
   ^~~~~~~~~

如有任何帮助,我们将不胜感激!

尝试理解错误:

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);

错误中的关键字是overloadedambiguous,当然还有函数本身。 当你理解这些词在C++语境中的含义时,你就会明白错误的原因。

那么您可以采用以下方法之一:

  1. 将函数名称从 to_string 更改为类似 my_to_string。这是天真的方法。
  2. 避免在全局范围内甚至导入所有 std 命名空间 函数范围并从现在开始遵循std::function的用法。