살아가는 이야기

ambiguous overloaded for 'operator<<' 본문

컴퓨터, 풀어그림

ambiguous overloaded for 'operator<<'

우균 2012. 4. 6. 14:05

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;
}

구체적인 타입을 받는 연산자로 오버로딩하면 된다.

Comments