hellowfriend   1년 전

다른 문제에서 코드를 제출 할 때는 left, right에 대해서 error: reference is ambiguous가 발생한 적이 없는데,

이번 경우에만 left, right에 대해서 error: reference is ambiguous가 발생하네요.

혹시 이유를 아시는 분은 알려주시면 감사하겠습니다.

좋은 하루 되세요!

shiftpsh   1년 전

std::ios에 left, right이 이미 있습니다. 변수 이름을 바꿔야 할 것 같습니다.

wak8835   1년 전

찾아보셨겠지만 비슷한 질문 사례가 있었습니다. (하단 링크 참고)

https://www.acmicpc.net/board/view/25788 


보통의 ambiguous(모호함) 에러는 전역에 설정한 변수 또는 함수 선언들이 
기존의 함수와 동일한 이름으로 등록하여 사용하려는 경우 일어납니다.
(윗글에도 나와 있지만 max, y0, y1 등과 같은 경우에도 충돌이 일어납니다.)


작성하신 분의 충돌 사례도 동일하게 왼쪽/오른쪽 정렬 출력에 해당되는 함수와 충돌한 사례입니다.

std::ios_base& std::left(std::ios_base&)
std::ios_base& std::right(std::ios_base&)

+ 추가적으로 high 라는 변수는 선언되어 있지 않으니 코드 한번 더 확인 부탁드립니다 :)

hellowfriend   1년 전

그런데 제가 공유기 설치 2110 문제에서는 left, right를 사용했는데 문제가 없었거든요.

https://www.acmicpc.net/proble...




```

#include
#include
#include
using namespace std;

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

int N = 0, C = 0;
cin >> N >> C;

vectorhouse(N, 0);
for (int i; i < N; i++) cin >> house[i];
sort(house.begin(), house.end());

int left = 0, right = house[N-1];

while (left <= right) {
int iptime_cnt = 1;
int pre_i = 0;
int mid = (left + right) / 2;
for (int i = 1; i < N; i++) {
if (house[i] - house[pre_i] >= mid) {
pre_i = i;
iptime_cnt++;
}
}
if (iptime_cnt >= C)
left = mid + 1;
else right = mid - 1;
}
cout << right;
}

```

wak8835   1년 전

우회하는 방법은 전역이 아닌 지역 선언을 하여 사용하는 방법이 있습니다.
(예를 들어, main 함수 안에 지역 변수로 left, right, high를 선언하여 사용)

대부분의 코테나 알고리즘 관련 대회 시에는
코드상의 복잡도를 최대한 줄이기 위에서 전역 선언을 하는 추세로

max를 mx, maxx 로,
y0을 cy0, y00, _y0 으로.
임시적 방편으로 충돌이 없게 사용하는 편이지만, 


변수명이나 차후 코드 유지보수함에 있어서는
지역변수로 선언하여 활용하시는 것이 보다 유리합니다.




wak8835   1년 전

댓글을 분리하여 두번 작성하여 작성자분과 타이밍이 엇갈리게 되었네요. 죄송합니다 ^^;;

hellowfriend   1년 전

정말 감사합니다. 궁금증이 아주 시원하게 해결되었네요. 좋은 하루 되세요!!

댓글을 작성하려면 로그인해야 합니다.