2016-12-27 2 views
0

Say Я использую using namespace std (неоспоримо bad practice) и что я использую функцию abs в моем коде (чтобы получить the overloaded absolute function). Конкретно мой MWE является:Abs и используя патезрасе

#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 

То, что я не понимаю, как «правильная» абс функция вызывается в последнем случае, учитывая, что даже stdlib.h имеет функцию abs, которая возвращает только int.

Фактически, второй ответ this question говорит, что использование using namespace std; может не достаточно. Это правда? Моя MWE, похоже, противоречит этому.

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

+0

Невозможно воспроизвести. Работает для меня, с gcc 6.2.1 –

+0

Ваша программа отлично работает и для меня. Это должна быть проблема с компилятором. – Yousaf

+1

Обновлено для включения версии компилятора gcc-4.8. – MaviPranav

ответ

5

При использовании

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

+0

Имеет смысл, мне было интересно, был ли какой-нибудь сценарий, в котором, несмотря на 'использование пространства имен std;' в файле, вызывался вызов 'abs (int)', просто указывая 'abs'. – MaviPranav

+0

@MaviPranav, так как вы приняли ответ, я предполагаю, что у вас есть ответы, которые вам нужны. Если нет, дайте мне знать. –

+0

Ответ правильный, но для меня все еще не является окончательным, может ли существовать ситуация с контрпримером, т. Е. 'Abs (int)' вызывается из вызова 'abs', несмотря на использование используемого пространства имен std;'. – MaviPranav

Смежные вопросы