Скажи я использую 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, который, возможно, является наиболее проблемной комбинацией для разрешения зависимостей.
Когда вы используете
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)
,
Других решений пока нет …