c++ - Visual Studio : Global namespace takes precedence over local

标签 c++ visual-studio-2010 gcc namespaces std

我今天收到了一些代码,它在 std::string 上使用 std::transform 使其全部变为小写。发件人在 Visual Studio 2010 中编写并编译了代码:

using namespace std;
string test = "TEST";
transform(test.begin(), test.end(), test.begin(), tolower);

虽然我在 OSx 上使用 GCC 和/或 Clang 编译它,但出现编译错误,因为它涉及命名空间的冲突。

确实有一堆解决全局命名空间与本地命名空间(::tolower 与 std::tolower)的已回答问题,但这是关于这段代码实际上在 VS 上运行的事实。

我想回答的问题:

  1. 为什么 Visual Studio 会编译它?
  2. 为什么它默认(?)到全局命名空间::当 std::应该采取 优先?

注意:我在 OSx Mountain Lion 上使用 GCC 4.2 和 Clang (425.0.24 LLVM 3.2svn)

最佳答案

这里的问题有两个。首先,如果你不特别 #include <cctype> ,你可能会得到一个 tolower那是一个宏,而不是一个函数(虽然我不知道这是否真的是一个问题,也不知道这是否会违反标准。)

其次,在 C++ 中 tolower重载了。您需要选择要使用的特定重载:

transform(test2.begin(), test2.end(), test2.begin(),
          static_cast<int(*)(int)>(tolower));

但我不知道为什么std::得到一个重载版本和::才不是。无论如何,我建议您远离那些 C 函数,而是使用 std::ctype来自 <locale> header ,它提供了更好的 tolower :

http://www.cplusplus.com/reference/locale/ctype

关于c++ - Visual Studio : Global namespace takes precedence over local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15024079/

相关文章:

c++ - 基于非成员函数的参数进行调度

android - cocos2d-x Android构建失败

c++ - 如何在 C++ 中对命令行参数进行排序

c++ - Visual Studio 2010 属性管理器中的 "Conditional"宏

gcc - C/GCC - 'at top level' 指什么?

类中的 C++17 变体<any>

c++ - 错误 : ambiguous overload for ‘operator[]’ when using boost-bind to boost-function

c# - 编辑现有 WP8 项目时出错

c++ - 不能在嵌套类中使用父类——即使嵌套类是在之后定义的

c - SCTP回显服务器代码: Byteorder warning messages