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

C++ std:: and include how they fit together?

我很困惑。我写了一个名为 hash() 的函数,我正在使用 namespace std cout、endl 和懒惰。

对 'hash' 的错误引用不明确

我现在知道 std::

中存在哈希函数

所以我的问题是为什么编译器会抛出这个错误,因为我从未包含 functional.h?

是否有来自 std:: 的名称的索引,以便我将来在编写自己的函数时可以避免使用这些名称,我找不到 google 的任何内容?

我很困惑,因为什么时候 "everything" 在 std:: 中是已知的:为什么需要包含 headers?我确定我遗漏了什么

也许我的标题不是最好的,但我不知道更好。

#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;
}

第一步,不要这样做:using namespace std;。您正在拉取 all 标准库的名称(至少是您直接看到的名称和 transitive 包含的名称)并且恰好std::hash 是一回事 - 最终会与您自己的 hash.

发生冲突

如果您 引入所有 std,而是使用 std:: 前缀明确引用 std 内容,或者只是引入您实际 想要(比如说std::vector)和using std::vector;这样的东西,那么你就不会有这个问题了。

命名空间的存在是为了将具有相同名称的符号分隔成单独的 domains/boxes。使用 using namespace foo; 会打败它。

具体回答为什么 std::hash 尽管没有直接包括它的 header 而被拉入:一些其他 header 你 包括它或包含一些其他 header 反过来包含它,等等 - 传递包含。

why the compiler throws this error because I did never include functional.h?

using namespace std;

因为你在全局命名空间中有这个,所以你是polluting the global namespace

这不是 well-defined 您将多少个符号带入全局命名空间。 header 允许包含其他 header,以及定义未记录的符号。

您还将自己的符号添加到同一个命名空间。您的任何全局符号都可能与命名空间 std.

中定义的符号发生冲突

教训:只要别那样做,你就不会有那个问题。

编译器尝试获取正确的散列函数。您的哈希函数在全局命名空间下实现,地址为 ::

::hash(1)

在正常情况下,编译器会使用这个命名空间,如果你用

调用它
hash(1)

但是你对编译 "hey dude, search every call also in std::" 说:

using namespace std;

所以他无法在

之间做出决定
::hash(1)
and
std::hash(1)

在全局范围内使用是头文件中的一个问题,因为您将此指令导入其他文件,其中包括您的头文件。

在 cpp 文件中,这是个人喜好问题。我也不想在 cpp 中使用它。