gpt4 book ai didi

C++ namespace 混淆 - std::vs::vs 调用 tolower 时没有前缀?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:37 24 4
gpt4 key购买 nike

这是为什么?

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:: 或什么都不使用?

感谢您的帮助。

最佳答案

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

还有一个 std::tolower但是,它需要两个参数。当您 using namespace std; 并尝试使用 tolower 时,编译器不知道您指的是哪一个,因此它会出错。

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

顺便说一句,这就是为什么 using namespace std; 可能不是一个好主意的例子。 std 中有足够多的随机内容(C++0x 添加了更多内容!)很可能会发生名称冲突。我建议您不要使用 using namespace std;,而是明确地使用,例如具体使用 std::transform;

关于C++ namespace 混淆 - std::vs::vs 调用 tolower 时没有前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com