1 답변
-
클래스 내에 아래와 같이
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; } };
그리고 첨언으로 코드를 사진이 아니라 텍스트로 넣어 주셨으면 답변하기 수월할 것 같습니다.
댓글 입력