我很困惑。我写了一个名为hash()的函数,我正在使用命名空间std cout,endl和laziness。
对'hash'的错误引用不明确
我现在知道std ::
中存在哈希函数所以我的问题是为什么编译器抛出此错误,因为我从未包含functional.h?
是否存在来自std ::的名称的任何索引,以便将来我编写自己的函数时可以避免这些名称,我找不到谷歌的任何内容?
我很困惑,因为当std中的“一切”已知时为什么需要包含标题?我确定我错过了什么
也许我的头衔并不是最好的,但我不知道更好。
#include <iostream>
using namespace std;
const int SIZE_TABLE = 10;
int hash(int x)
{
return x%SIZE_TABLE;
}
int main()
{
cout<<"hash 24 "<<hash(24)<<endl;
return 0;
}
答案 0 :(得分:3)
编译器尝试获取正确的哈希函数。您的哈希函数在全局名称空间下实现,使用::
进行寻址::hash(1)
在正常情况下,如果使用
调用它,编译器将使用此命名空间hash(1)
但是你要对编译说“嘿老兄,在std ::中搜索每一个电话”,用:
using namespace std;
因此他无法决定
::hash(1)
and
std::hash(1)
全局范围内使用是头文件中的问题,因为您将此指令导入其他文件,其中包括您的头文件。
在cpp文件中,这是品味问题。我也不想在cpp中使用它。
答案 1 :(得分:2)
第一步,不要这样做:using namespace std;
。您正在提取所有标准库的名称(至少是您的直接和传递包含的名称),而恰好std::hash
是一件事 - 最终与你自己的hash
发生冲突。
如果您改为不拉入所有std,但要么使用std::
前缀明确引用std内容,或者只是拉入实际想要的东西(说std::vector
)类似于using std::vector;
,那么你就不会遇到这个问题。
存在命名空间,用于将具有相同名称的符号分隔到单独的域/框中。使用using namespace foo;
会失败。
具体回答为什么std::hash
被拉进来,尽管没有直接包含其标题:您做包含的其他标题包括它或包含一些其他标题,而这些标题又包含它,等等 - 传递包括。
答案 2 :(得分:2)
为什么编译器会抛出此错误,因为我从未包含functional.h?
using namespace std;
因为您在全局命名空间中拥有此功能,所以 polluting the global namespace 。
没有明确定义您将多少个符号带入全局命名空间。允许标头包含其他标头,以及定义未记录的符号。
您还将自己的符号添加到同一名称空间。您的任何全局符号都可能与名称空间std
中定义的符号冲突。
课程:不要这样做,你就不会遇到这个问题。