gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:06:40 27 4
gpt4 key购买 nike

我今天收到了一些代码,它在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com