1 2 3 4 5 6 7 8 9 10 11 12 13 | template<typename T> void Safe_Delete_VecList(T& p) { T::iterator iter; T::iterator iterEnd = p.end(); for (iter = p.begin(); iter != iterEnd; iter++) { SAFE_DELETE((*iter)); } p.clear(); } | cs |
컴파일 결과 코드 4번 째 줄에
C2760 구문 오류: '식별자'은(는) 예기치 않은 토큰입니다. 필요한 토큰은 ';' 입니다.
C7519 'iterator': 종속적 형식 이름은 'typename' 접두사와 함께 사용해야 합니다.
두 가지 오류가 나타났다.
T에 리스트나 벡터가 레퍼런스로 들어와 모두 초기화해주는 함수인데, T::iterator 가 먹히지 않는 것 같다.
현재는 auto를 이용하여 아래와 같이 변경하였고 컴파일이 되었으나 아직 명쾌하게 해결한 느낌은 받지 못했다.
1 2 3 4 5 6 7 8 9 10 11 12 | template<typename T> void Safe_Delete_VecList(T& p) { auto iterEnd = p.end(); for (auto iter = p.begin(); iter != iterEnd; iter++) { SAFE_DELETE((*iter)); } p.clear(); } | cs |
3/6 // T 앞에 typename을 붙여주기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | template<typename T> void Safe_Delete_VecList(T& p) { typename T::iterator iter; typename T::iterator iterEnd = p.end(); for (iter = p.begin(); iter != iterEnd; iter++) { SAFE_DELETE((*iter)); } p.clear(); } | cs |
auto를 사용하지 않고, 위의 코드처럼 typename을 앞에 붙여주자 2760, 7519 오류 모두 나타나지 않았다.
6/3 // 컴파일러는 T::iterator가 타입인지 알 수 없다.
effective c++를 읽던 도중 이 게시글이 생각나 돌아왔다.
코드 상에서 typename을 뺀 채로 T::iterator만 써줬을 경우, 컴파일러는 T::iterator가 타입이 아닌 것으로 가정해 버릴 수 있다.
따라서 T::iterator가 타입임을 알려주어야 하고, 그 키워드가 typename 이라는 키워드인 것이다.
템플릿 안에서 중첩 의존 이름 ( 템플릿 매개변수에 종속된 것 ) 을 참조할 경우에는 typename 키워드를 잊지말고 붙여주자.
'문제 해결' 카테고리의 다른 글
<문제점> 헤더 파일 내의 정적 멤버 함수에서 다른 클래스의 함수 사용하기 (0) | 2019.03.03 |
---|