c++ 함수 오버로딩 에러

thsckdgus9의 이미지

#include<iostream>
using namespace std;
 
int abs(int n);
double abs(double n);
 
int main(void)
{
	cout << "-123    절대값:  " << abs(-123) << endl;
	cout << "-12.345 절대값:  " << abs(-12.345) << endl;
 
	return 0;
}
 
int abs(int n)
{
	return n < 0 ? -n : n;
}
 
double abs(double n)
{
	return n < 0 ? -n : n;
}

오버로딩 조건이 1.매개변수 갯수가 다르다
2.함수 반환형이 다르다
위 두가지 중 하나라도 만족하면 되는걸로 알고 있는데 위 코드같이 반환형을 달리 해줘도 재정의라고 오류가 나네요..? 그래서 두 함수 모두 매개변수 1개씩 추가했는데 그 코드는 실행이 됩니다 왜그럴까요>?

아이온@Naver의 이미지

std::abs가 cmath에 정의되어 있고, 그게 iostream에 include가 되어서 global function인 abs--이 코드에서 직접 정의한 것--과 겹쳐서 그렇습니다. abs(-12.345)할 때 std:: 인지 ::인지 using namespace std 라인 때문에 알 수가 없어서요.

int type의 abs도 비슷하면서 다른 문제가 있는데 지금 호출되는 건 이 코드의 abs가 아니라 라이브러리의 ::abs인 것 같네요.

매개 변수를 추가하면, 이제 cstdlib/cmath의 abs와 겹치지 않기 때문에 컴파일이 됩니다.