C++ C++;名称空间混淆-std::vs::vs调用tolower时没有前缀?

C++ C++;名称空间混淆-std::vs::vs调用tolower时没有前缀?,c++,namespaces,name-decoration,C++,Namespaces,Name Decoration,为什么会这样 transform(theWord.begin()、theWord.end()、theWord.begin()、std::tolower)-不工作 transform(theWord.begin()、theWord.end()、theWord.begin()、tolower)-不工作 但是 transform(theWord.begin(),theWord.end(),theWord.begin(),::tolower)-有效吗 这个词是一个字符串。我正在使用名称空间std 为什么

为什么会这样

transform(theWord.begin()、theWord.end()、theWord.begin()、std::tolower)-不工作
transform(theWord.begin()、theWord.end()、theWord.begin()、tolower)-不工作

但是

transform(theWord.begin(),theWord.end(),theWord.begin(),::tolower)-有效吗

这个词是一个字符串。我正在
使用名称空间std

为什么它与前缀
::
一起工作,而与
std::
一起工作或者不工作


感谢您的帮助。

使用名称空间std
指示编译器在
std
中搜索未修饰的名称(即没有
s的名称)以及根命名空间。现在,您正在查看的是C库的一部分,因此位于根命名空间中,它始终位于搜索路径上,但也可以使用
::tolower
显式引用

但是,还有一个参数,它需要两个参数。当您使用命名空间std时,
tolower
,编译器不知道您指的是哪一个,因此它就变成了一个错误

因此,您需要使用
::tolower
来指定您想要在根命名空间中使用的名称


顺便提一下,这就是为什么
使用名称空间std可能是个坏主意。
std
中有足够多的随机内容(C++0x添加了更多!),很可能会发生名称冲突。我建议您不要使用
名称空间std,并且相当明确地使用,例如使用std::transform的
特别是。

您包括哪些头文件?
#include#include#include#include#include#include#include
So::tolower告诉编译器在根名称空间中查找,std::tolower告诉编译器在标准名称空间中查找。对吗?在这种情况下,我想要根名称空间中的tolower,而不是标准名称空间中的tolower。或者您可以停止使用
使用命名空间std
,而tolower将正常工作:)从技术上讲,OP的::tolower()只存在于实现细节中。为了保证C库的
tolower
在全局命名空间中,必须包含
,而不是
(请参见
D.5[depr.C.headers]/2
),因此,如果一个包含并同时包含,那么std::tolower将来自哪个?HayriUğurKoltuk。它们的定义不同,所以两者都有。