Abs 和使用命名空间标准
Abs and using namespace std
假设我正在使用 using namespace std
(不可否认 bad practice) and that I use the abs
function in my code (to get the overloaded absolute function)。具体来说,我的 MWE 是:
#include <cmath>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(int argc, char* argv[]) {
double f(-0.4);
std::cout<<"abs(f) = "<<abs(f)<<std::endl;
}
如果我注释掉 using namespace std;
行,则输出为
abs(f) = 0
否则输出为
abs(f) = 0.4
我不明白的是 "correct" abs 函数是如何在后一种情况下调用的,因为即使 stdlib.h 也有一个 abs
函数,而 returns int
的。
事实上 this question 的第二个答案说使用 using namespace std;
可能 不够 。这是真的?我的 MWE 似乎与此相矛盾。
我正在 Linux 并使用 gcc-4.8,这可以说是解决依赖关系问题最严重的组合。
当您使用
using namespace std;
您将 abs
的以下重载带入作用域:
std::abs(int)
std::abs(float)
std::abs(std::complex)
调用 abs(f)
解析为 std::abs(float)
。
如果你不使用
using namespace std;
您只能使用一个 abs
功能。
abs(int)
因此,调用 abs(f)
解析为 abs(int)
。
您仍然可以删除 using namespace std;
行并使用 std::abs(f)
而不仅仅是 abs(f)
.
假设我正在使用 using namespace std
(不可否认 bad practice) and that I use the abs
function in my code (to get the overloaded absolute function)。具体来说,我的 MWE 是:
#include <cmath>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(int argc, char* argv[]) {
double f(-0.4);
std::cout<<"abs(f) = "<<abs(f)<<std::endl;
}
如果我注释掉 using namespace std;
行,则输出为
abs(f) = 0
否则输出为
abs(f) = 0.4
我不明白的是 "correct" abs 函数是如何在后一种情况下调用的,因为即使 stdlib.h 也有一个 abs
函数,而 returns int
的。
事实上 this question 的第二个答案说使用 using namespace std;
可能 不够 。这是真的?我的 MWE 似乎与此相矛盾。
我正在 Linux 并使用 gcc-4.8,这可以说是解决依赖关系问题最严重的组合。
当您使用
using namespace std;
您将 abs
的以下重载带入作用域:
std::abs(int)
std::abs(float)
std::abs(std::complex)
调用 abs(f)
解析为 std::abs(float)
。
如果你不使用
using namespace std;
您只能使用一个 abs
功能。
abs(int)
因此,调用 abs(f)
解析为 abs(int)
。
您仍然可以删除 using namespace std;
行并使用 std::abs(f)
而不仅仅是 abs(f)
.