今天我收到了一些代码,它使用std::transform对std::string进行转换,使其全部小写。发件人在Visual 2010中编写和编译了代码:
using namespace std;
string test = "TEST";
transform(test.begin(), test.end(), test.begin(), tolower);当我用GCC和/或Clang在OSx上编译它时,得到了编译错误,因为它涉及名称空间的冲突。
确实有许多问题回答了全局命名空间与本地(::tolower VS std::tolower)之间的问题,但这是因为这段代码实际上适用于vs。
问题,我想要答案:
注:我在OSx山狮上使用GCC 4.2和Clang (425.0.24 LLVM 3.2svn)。
发布于 2013-02-22 12:42:53
这里的问题有两方面。首先,如果没有专门的#include <cctype>,您可能会得到一个宏,而不是一个函数(虽然我不知道现在这是否真的是一个问题,也不知道这是否会违反标准。)
其次,在C++中,tolower是重载的。您需要选择要使用的特定重载:
transform(test2.begin(), test2.end(), test2.begin(),
static_cast<int(*)(int)>(tolower));但是我不知道为什么std::会得到一个重载的版本,而::却没有。无论如何,我建议您远离那些C函数,而使用来自<locale>头的<locale>,它提供了一个更好的tolower
http://www.cplusplus.com/reference/locale/ctype
https://stackoverflow.com/questions/15024079
复制相似问题