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

时间:2011-07-12 02:04:40

标签: 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); - 确实有效

theWord是一个字符串。我是using namespace std;

为什么它使用前缀::而不是std::或没有?

感谢您的帮助。

1 个答案:

答案 0 :(得分:16)

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

但是还有一个std::tolower,它有两个参数。当你有using namespace std;并尝试使用tolower时,编译器不知道你的意思,所以它会变成错误。

因此,您需要使用::tolower指定您希望根域名空间中的那个。

顺便提一下,这是using namespace std;可能是个坏主意的一个例子。 std中有足够的随机内容(并且C ++ 0x增加了更多!),很可能发生名称冲突。我建议您不要使用using namespace std;,而应明确使用,例如using std::transform;具体而言。