Abs и использование пространства имен std

Скажи я использую 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 имеет abs функция, которая только возвращает int"S.

На самом деле второй ответ на этот вопрос говорит о том, что с помощью using namespace std; может быть недостаточно. Это правда? Мой MWE, кажется, противоречит этому.

Я использую Linux и использую gcc-4.8, который, возможно, является наиболее проблемной комбинацией для разрешения зависимостей.

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),

Другие вопросы по тегам