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, который, возможно, является наиболее проблемной комбинацией для разрешения зависимостей.

0

Решение

Когда вы используете

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]