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 中使用它。
我很困惑。我写了一个名为 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 中使用它。