这仅是我碰巧注意到的一个例子!
我将cout
与operator<<
一起使用,为什么该程序无法编译?
为什么不按函数重载的方式考虑它们?
#include <iostream> // imports the declaration of std::cout
using namespace std; // makes std::cout accessible as "cout"
int cout() // declares our own "cout" function
{
return 5;
}
int main()
{
cout << "Hello, world!"; // Compile error!
return 0;
}
答案 0 :(得分:3)
在尝试插入流时,在全局范围内有两个名称cout
:一个是来自标准库std::cout
的名称,该名称由该地标using
声明引入了全局范围,以及一个定义为函数int cout()
的函数。在表达式中
cout << "Hello, world!\n";
cout
的用法不明确。没有函数重载有两个原因:首先,std::cout
不是函数,因此不会参与重载。但更根本地讲,在该表达式中使用cout
并不是函数调用,因此,再次没有重载。函数定义中的名称cout
被视为指向函数的指针,命名空间cout
中的名称std
是对象的名称。该名称有两种可能的解释,因此它在<<
表达式中的使用含糊不清。