c++ 클래스 템플릿에서 <<연산자 질문입니다.

조회수 1510회

이미지

이미지

위 코드에서 저런 오류가 나오는데 왜그런지 모르겠습니다 ㅠ

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    클래스 내에 아래와 같이 friend 로 함수를 선언할 경우, 해당 함수를 friend로 설정하고 함수가 존재함을 선언합니다.

    template<typename T>
    class M {
        // ...
        friend ostream& operator<<(ostream& os, const M<T>& ref);
    };
    

    즉, ostream& operator<<(ostream& os, const M<T>& ref) 란 일반 자유 함수(비 멤버 함수)가 존재함을 선언합니다.

    이 후 아래와 같이 operator<<() 을 호출할 때 C++ 의 이름 이름 조회 규칙에 따라 호출할 함수를 찾게 됩니다.

    int main() {
        M<int> m(1);
        std::cout << m;
    }
    

    문제는 여기서 발생합니다.

    이름 조회 규칙에 따라 동일한 이름의 자유 함수와 함수 템플릿이 있을 경우, 함수 템플릿을 인스턴스화 하지 않고 자유 함수를 사용하게 됩니다.

    앞서 말씀드렸듯이 friend ostream& operator<<(ostream& os, const M<T>& ref);으로 인해 자유 함수 ostream& operator<<(ostream& os, const M<T>& ref)가 선언되어 있는 상황입니다.

    그러므로 main() 에서는 함수 템플릿 template<typename T> ostream& operator<<(ostream& os, const M<T>& ref)를 사용하지 않고 자유 함수 ostream& operator<<(ostream& os, const M<T>& ref)를 사용하나, 이 자유 함수는 선언만 되어있고 정의가 되어 있지 않기 때문에 링크 단계에서 오류가 발생한 것 입니다.

    해결 방법은 friend 연산자를 선언할 때 해당 함수가 함수 템플릿 이라는 것을 명확히 하거나 자유 함수를 정의해 주면 됩니다.

    • 함수 템플릿 명시 방법

      template<typename T>
      class M {
          // ...
          template<typename U>
          friend ostream& operator<<(ostream& os, const M<U>& ref);
      };
      
    • 자유 함수 정의 방법

      template<typename T>
      class M {
          // ...
          friend ostream& operator<<(ostream& os, const M<T>& ref) {
              return os << ref.num;
          }
      };
      

    그리고 첨언으로 코드를 사진이 아니라 텍스트로 넣어 주셨으면 답변하기 수월할 것 같습니다.

    • 덕분에 제대로 알아갑니다. 감사합니다!!!! 김재영 2018.6.7 03:11

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)