0

假设我正在使用using namespace std(不可否认的不良做法)并且我abs在代码中使用了该函数(以获取重载的绝对函数)。具体来说,我的 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

我不明白在后一种情况下如何调用“正确”的 abs 函数,因为即使 stdlib.h 有一个abs只返回int's 的函数。

事实上,这个问题的第二个答案说 usingusing namespace std;可能还不够。这是真的?我的 MWE 似乎与此相矛盾。

我在 Linux 上使用 gcc-4.8,这可以说是解决依赖关系最有问题的组合。

4

1 回答 1

5

当你使用

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).

于 2016-12-27T18:55:36.420 回答