본문 바로가기

문제 해결

<문제점> 오류) C2760, C7519 // 구문 오류: '식별자'은(는) 예기치 않은 토큰입니다. 필요한 토큰은 ';' 입니다.

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 키워드를 잊지말고 붙여주자.