살아가는 이야기
ambiguous overloaded for 'operator<<' 본문
C++에서 스트림 입력 연산자 >>나 출력 연산자 <<를 오버로딩(overloading, 재지정)할 때 간혹 다음과 같은 오류가 발생하기도 한다.
ambiguous overloaded for 'operator<<'
그 원인은 오버로딩 함수 검색 알고리즘(overloading resolution algorithm) 때문인데, 즉 위 오류 메시지는 '컴파일러가 어떤 <<를 사용해야 할지 모호하다'는 뜻이다. 예컨대 다음과 같은 코드가 있다고 하자.
int x = 5;
operator <<(cout, x);
그러면 위와 비슷한 오류 메시지가 발생한다. 원인을 살펴보려면 라이브러리에 출력 연산자 <<가 어떻게 정의되어 있는지 살펴보아야 한다. C++ 표준 라이브러리에는 연산자 <<가 다음과 같은 세 가지 형태로 정의되어 있다.
1. 템플릿 클래스 basic_ostream<C>의 멤버함수
2. basic_ostream<C, T>&와 char *를 받고 basic_ostream<C, T>를 리턴하는 일반 템플릿 함수
3. ostream&와 임의의 타입 T를 받고 ostream&를 리턴하는 일반 템플릿 함수
그런데 operator<<(cout, x) 호출은 2와 3 중에서 하나 선택해야 하기 때문에 오류가 발생하는 것이다. 반면 다음 호출은 오류가 발생하지 않는다.
cout << x;
그 이유는 1번 멤버함수로 해결 가능하기 때문이다.
따라서 이 오류를 없애려면
cout.operator <<(x);
형태로 멤버함수를 사용하거나 아니면 별도로 아래와 같이
template<class C>
basic_ostream<C>& operator <<(basic_ostream<C>& out, int x) {
return out << x;
}
구체적인 타입을 받는 연산자로 오버로딩하면 된다.