C ++ std ::并包括它们如何组合在一起?

时间:2018-05-09 20:47:25

标签: c++ include std

我很困惑。我写了一个名为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;
}

3 个答案:

答案 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中定义的符号冲突。

课程:不要这样做,你就不会遇到这个问题。