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。它们的定义不同,所以两者都有。