【问题标题】:Abs and using namespace std绝对值和使用命名空间标准
【发布时间】:2016-12-27 18:44:31
【问题描述】:

假设我正在使用using namespace std(不可否认bad practice)并且我在我的代码中使用abs 函数(以获取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

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

事实上,this question 的第二个回答说使用using namespace std; 可能不够。这是真的?我的 MWE 似乎与此相矛盾。

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

【问题讨论】:

  • 无法复制。为我工作,使用 gcc 6.2.1
  • 您的程序也适合我。一定是编译器问题。
  • 更新为包含编译器版本 gcc-4.8。

标签: c++ namespaces std absolute-value


【解决方案1】:

当你使用时

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;,但在简单地指定abs 时调用了abs(int)
  • @MaviPranav,既然你接受了答案,我假设你得到了你需要的答案。如果没有,请告诉我。
  • 答案是正确的,但我仍然不确定是否存在反例情况,即 abs(int) 从对 abs 的调用中被调用,尽管使用了 using namespace std;
  • 当然,如果#include 被删除(即使使用命名空间std),也可以调用abs(int)。删除标头时这种类型的静默更改在较大的应用程序中是致命的。幸运的是,几乎所有编译器都会给出关于将双精度值截断为整数的警告。还有一个需要注意编译器警告的理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2022-01-11
相关资源
最近更新 更多