在下面的例子中,“using std::cout”如何成功运行,而“using namespace std”却不成功?

3
我正在研究命名空间主题,发现当我们编译以下代码时,编译器会抱怨:

[错误] 对 'cout' 的引用不明确

#include <iostream> 

void cout() 
{
 std::cout << "In cout function\n";
}

int main()
{
using namespace std; 
cout << "Hello, world!\n";
return 0;
}

但是,如果我们将using namespace std替换为using std::cout,程序就可以成功运行并产生预期的输出。这是如何实现的呢?

#include <iostream> 

int cout() 
{
std::cout << "In cout function\n";
}

int main()
{
using std::cout;  //REPLACED 
cout << "Hello, world!\n";
return 0;
}

据我所知,using std::coutusing namespace std之间唯一的区别是:using std::cout只从std命名空间中导入cout,而using namespace std则会导入std中的所有变量。
在这两种情况下,cout()函数和std::cout变量都可以在主函数中访问。那么为什么using std::cout可以解决问题,而using namespace std却不能呢?

5
这里都不需要导入。恐怕在其他语言方面的经验在这里是一个劣势,因为C++在这方面非常特别。例如,请参见Using directive vs using declaration - StoryTeller - Unslander Monica
1
你不能通过试错来学习C++。必须使用一本好的C++书籍来学习,可以参考stackoverflow上的推荐书单。了解如何使用using指令和using声明。 - Jason
1
还可以参考重复问题:关于在进行非限定调用时使用名称与使用命名空间的歧义性,其中详细解释了这个问题。 - Jason
2
@Spectras 可能是因为第一个相关的问题即刻出现在“https://dev59.com/D3M_5IYBdhLWcg3wQQ3w?rq=2”,其中一个主要原因是由于二义性而导致编译错误。 - Öö Tiib
1个回答

3

非正式:

using std::cout 意味着“在此作用域中,标识符 cout 特指 std::cout,因此不要在其他地方查找它”。

using namespace std 意味着“将 std 中的所有名称添加到当前作用域中,以及还在作用域中的其他所有内容”。

在第一种情况下,您明确表示 cout 意味着 std::cout - 全局 cout 已被隐藏,因此不存在歧义。

在第二种情况下,cout 是不明确的,因为它可能指的是 std::cout 或者您的函数。

如果您尝试在 main 中声明函数,您将在第一种情况下看到类似的错误:

int main()
{
    int cout();
    using std::cout;
    cout << "Hello, world!\n";
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接