ABS并使用命名空间性标准



说我正在使用 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也具有仅返回int'S的abs函数。

实际上,这个问题的第二个答案说,使用using namespace std; May 不够。这是真的?我的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)

最新更新