2016-12-27 5 views
0

using namespace std(間違いなくbad practice)と私のコードでを使用しています(the overloaded absolute functionを得るために)私はabs関数を使用しています。具体的には、私のMWEは次のとおりです。私はusing namespace std;行をコメントアウトした場合Absとnamespace 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; 

} 

は、出力が他の

abs(f) = 0 

出力は、私は理解していない何

abs(f) = 0.4 

があるです後者の場合、たとえstdlib.hでもintが返されるabs関数があるとすると、 "正しい" abs関数がどのように呼び出されますか?

実際にthis questionの2番目の答えは、using namespace std;を使用すると、が十分でないと言います。です。これは本当ですか?私のMWEはこれに矛盾するようです。

私はLinux上でgcc-4.8を使用していますが、これはおそらく依存関係を解決するための最も問題のある組み合わせです。あなたは

using namespace std; 

を使用する場合

+0

再生できません。私のための作品、gcc 6.2.1 –

+0

あなたのプログラムは私にとってもうまくいきます。これはコンパイラの問題でなければなりません。 – Yousaf

+1

コンパイラ・バージョンgcc-4.8を含むように更新されました。 – MaviPranav

答えて

5

あなたはスコープに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;行を削除して、abs(f)の代わりにstd::abs(f)を使用することはできます。

+0

ファイル内で 'namespace std;'を使用しているにもかかわらず、単純に 'abs'を指定している間に' abs(int) '呼び出しが呼び出されるというシナリオがあるかどうか、ほとんど疑問に思っていました。 – MaviPranav

+0

@MaviPranavあなたが答えを受け入れたので、私はあなたが必要な答えを得ていると仮定しています。そうでない場合は、私に知らせてください。 –

+0

答えは正しいですが、 'using namespace std; 'が使用されているにもかかわらず、反例状況が存在する可能性があるかどうかはまだ分かりません。 – MaviPranav

関連する問題