2016-12-27 78 views
0

說我使用using namespace std(不可否認bad practice),並且我在我的代碼中使用abs函數(得到the overloaded absolute function)。具體來說我MWE是:Abs和使用命名空間std

#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。

其實第二回答this question說使用using namespace std;可能不夠。這是真的?我的MWE似乎與此相矛盾。

我在Linux上使用gcc-4.8,這可以說是解決依賴關係時最成問題的組合。

+0

無法重現。適用於我,使用gcc 6.2.1 –

+0

您的程序對我來說工作正常。它必須是一個編譯器問題。 – Yousaf

+1

已更新爲包含編譯器版本gcc-4.8。 – MaviPranav

回答

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)

+0

有道理,我主要想知道是否有任何場景,儘管在文件中使用了'namespace std;',但只需指定'abs',就調用了abs(int)調用。 – MaviPranav

+0

@MaviPranav,既然你接受了答案,我假設你有你需要的答案。如果沒有,請告訴我。 –

+0

答案是正確的,但是對於我是否仍然存在一個反例情況,即使用'使用名稱空間標準;'來調用'abs(int)'從'abs'調用仍然不確定。 – MaviPranav