为什么"std::isdigit"在 Windows 上报告C++"no matching overloaded function"

Why does "std::isdigit" report "no matching overloaded function" in C++ on Windows

本文关键字:no C++ matching overloaded 报告 function Windows std isdigit 为什么      更新时间:2023-10-16

我实现了这个问题的公认答案,它使用std::isdigit:

#include <string>
#include <ctype.h>
using namespace std;
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}

它在Mac OS X上运行良好。然而,当在VS17 Professional 15.9.3 for Windows 10中使用MSVC时,我会收到以下编译器错误:

C2672 'std::isdigit': no matching overloaded function found.

我正在移植代码,并且知道这适用于MacOSX和clang。我已经包含了<string><cctype><ctype.h><stdlib.h>,没有任何帮助。

这对我来说毫无意义。

函数isdigit()在C标头ctype.h或C++标头cctype中定义。

如果您在C++文件中包含ctype.h,那么isdigit()是在全局命名空间中定义的(有些实现也放在std::中(。

相反,如果从C++文件中包含cctype,则isdigit()定义在标准名称空间std::中(某些实现也位于全局名称空间中(。

在您的案例中,您有#included <ctype.h>,在windows上,这似乎意味着它只在全局命名空间中可用。因此CCD_ 15不匹配任何已知的函数。尝试将include更改为#include <cctype>

#include <cctype>
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}

事实证明,这是一个类似的问题。使用std名称空间(即using namespace std;(时会有一些歧义。如果您将代码中的std::isdigit更改为isdigit,它将在Windows上编译。

#include <string>
#include <ctype.h>
using namespace std;
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}