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 関数がどのように呼び出されるかということabsですint

実際、この質問に対する 2 番目の回答では、 を使用するだけでは十分でusing 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使用できる機能は 1 つだけです。

abs(int)

したがって、呼び出しabs(f)は に解決されabs(int)ます。

using namespace std;行を削除して、std::abs(f)代わりにabs(f).

于 2016-12-27T18:55:36.420 に答える