首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual Studio:全局命名空间优先于本地名称空间

Visual Studio:全局命名空间优先于本地名称空间
EN

Stack Overflow用户
提问于 2013-02-22 12:16:24
回答 1查看 319关注 0票数 3

今天我收到了一些代码,它使用std::transform对std::string进行转换,使其全部小写。发件人在Visual 2010中编写和编译了代码:

代码语言:javascript
复制
using namespace std;
string test = "TEST";
transform(test.begin(), test.end(), test.begin(), tolower);

当我用GCC和/或Clang在OSx上编译它时,得到了编译错误,因为它涉及名称空间的冲突。

确实有许多问题回答了全局命名空间与本地(::tolower VS std::tolower)之间的问题,但这是因为这段代码实际上适用于vs。

问题,我想要答案:

  1. 为什么Visual要编译这个?
  2. 为什么它是默认的(?)到全局命名空间::when std::应该优先?

  • 这里有一个理想的片段(有错误):http://ideone.com/qvUAMw
  • 这里有一个理想的片段(起作用):http://ideone.com/lk0H5d

注:我在OSx山狮上使用GCC 4.2和Clang (425.0.24 LLVM 3.2svn)。

EN

回答 1

Stack Overflow用户

发布于 2013-02-22 12:42:53

这里的问题有两方面。首先,如果没有专门的#include <cctype>,您可能会得到一个宏,而不是一个函数(虽然我不知道现在这是否真的是一个问题,也不知道这是否会违反标准。)

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

代码语言:javascript
复制
transform(test2.begin(), test2.end(), test2.begin(),
          static_cast<int(*)(int)>(tolower));

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15024079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档