3

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

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

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

确实有很多已回答的问题涉及全局命名空间与本地(::tolower 与 std::tolower),但这是关于这段代码实际上适用于 VS 的事实。

我想回答的问题:

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

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

4

1 回答 1

1

这里的问题是双重的。首先,如果您没有特别说明#include <cctype>,您可能会得到tolower一个宏,而不是函数(尽管我不知道这几天这是否真的是一个问题,以及这是否会破坏标准合规性。)

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

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

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

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

于 2013-02-22T12:42:53.737 回答