음.. 우리나라 말로 번역하면, "템플릿 친구 만들기"로 표현되는데, 무슨 말인고 하면, "클래스에 friend 선언시 클래스 템플릿 또는 함수 템플릿를 firned 하기" 를 말한다.

예로 쓸 함수는, boost의 checked_delete 함수 템플릿을 사용해 보기로 한다. 이 함수의 헤더 파일은 boost/checked_delete.hpp 이다. 전문은 아래 소개 한다.

이 전문의 32라인, 33라인이 이해가 가지 않아 KLDP 에 질문을 올려, 답변을 받아 보았다. 링크 

정리 하자면, forword declaration(전방 선언)경우, operator delete 가 재정의 되었거나, 가상 소멸자를 호출해서 삭제해야 되는 경우, 예기치 않은 동작을 할 수 있기 때문에, 컴파일 타임에 오류를 보고 받기 위함의 코드인 것이다.

이야기가 다른 곳에 갔는데, 다시 출발점으로 와서, 아래와 같은 상황이 있다고 생각해 보자. 이런 경우는 자주 있는것은 아니지만, 간혹 있을 수 있다.(객체의 소멸을 특정 함수에서만 처리하고자 하고 싶을 때... )

이 때 boost::checked_delete 를 어떻게 friend 하는게 좋을까?

허브 셔터는 다음과 같은 질문으로, 논쟁을 유도 한다.


1) boost::checked_delete 를 friend 로 만드는, 표준을 만족하는 방법은 무엇인가?

여러가지가 있겠지만, 다음과 같이 정의 할 수 있겠다.


2 ) 질문 1) 의 답변이 신뢰할 수 없는 이유와 더 신뢰 할 수 있게 만드는 방법은 무엇인가?

신뢰 할 수 없는 이유는 함수 템플릿은 특성상 매개변수의 타입을 추론하여, 인스턴스화 되어지는데, 컴파일러마다, 이 추론 과정이 다른 이름공간에 있는 함수 템플릿일 경우, 추론하기 어렵기 때문이라고 한다.


더 신뢰 할 수 있게 만드는 방법


지침

보다 표현하고자 하는 기능을 보다 명시적으로 표현하는게 더 좋다는 것이 허브셔터의 요약이다.


총평

함수 템플릿을 friend 로 하는 방법은 위의 두 방법이 있는데, 그 중 아래 방법을 선호하는게 더 좋다. 왜냐하면, 첫번째는 항상 작동하지 않을 수 있기 때문이다. 두번째도 항상 작동하는것은 아니지만, 첫번째보다 이식성이 그나마 조다. gcc 컴파일러에서 안되지만, 뭐 그런데로 쓸만하니, 참고해야겠다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기