2010-05-21 3 views
1

Windows에서 일부 템플릿 코드를 이식하는 중이며 iPhone 3.2 SDK에서 일부 컴파일러 차이가 발생합니다. 클래스 템플릿의 멤버 함수 내부iPhone SDK 3.2에서 템플릿 컴파일 오류가 발생했습니다.

원본 코드는 다음과 같습니다 BinarySearch 다른 템플릿에서 상속하는 방법입니다

return BinarySearch<uint32, CSimpleKey<T> >(key); 

.

이 다음과 같은 오류 발생 :

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)' 

비주얼 스튜디오 컴파일러는 템플릿 계층의 벌금을 걸어 보이지만 GCC는 함수가 어디에서 오는지 완전히 자격을 날 필요는 (I 같은 고정하여이 문제를 확인했습니다 그런 식으로 템플릿 멤버 변수 문제. 이제 다음과 같은 오류 발생

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key); 

:

그래서 내가 지금 이것을 변경해야 할 몇 가지 머리를 긁적 후

csimplekeytable.h:132: error: expected primary-expression before ',' token 
csimplekeytable.h:132: error: expected primary-expression before '>' token 

을, 나는 여기에서 일어나고 것은 그것이하려고한다는 것입니다 생각 어떤 이유로 BinarySearch를 'Less Than'연산자로 사용하기 전에 '<'을 해결하십시오.

두 가지 질문 : - 오류에 대한 나의 해석과 함께 올바른 길을 가고 있습니까? - 어떻게 수정합니까?

-D

답변

0

CSimpleTable이 기본 클래스 인 경우 해당 기본 클래스 이름 또는 this으로 통화를 한정해야합니다. 그러나 둘 다 템플릿 매개 변수에 의존하기 때문에 컴파일러는 BinarySearch의 의미를 조회 할 수 없습니다. 정적 정수 상수 일 수 있습니다. 다른 정수와 비교하거나, <...>에 포함 된 인수를 넣을 수 있습니다.당신은 후자

/* the "::template" means: 'the name that follows is a template' */ 
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key); 

에 대해 또는 this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key); 

와 컴파일러에게 필요한 자격에 대한 이유는 컴파일러 (템플릿 매개 변수에 따라 기본 클래스 규정되지 않은 이름을 보이지 않는다는 것입니다 귀하의 경우 매개 변수는 T입니다. 이름의 바인딩은 기본 클래스가 그런 이름을 가지고 있는지 여부에 달려 있기 때문에 불행한 것으로 간주됩니다. BinarySearch과 같은 일반 이름의 경우이 이름이 템플리트 매개 변수에 종속된다는 표시가 없기 때문에 표준에서는 컴파일러가 인스턴스화까지 이름 찾기를 지연시키지 않아야합니다. 그래서 이름은 비록 종속 기지에서 조회가 인스턴스화 (허용되지 않음)에서 허용 되더라도 어쨌든 발견되지 않았습니다.

컴파일러에게 해당 클래스를 한정하여 명시 적으로 지정해야합니다.이 경우 컴파일러는 인스턴스 생성시 조회 중에 종속 기본 클래스를 포함합니다. 접두사가 this 또는 클래스 이름 인 경우 으로 종속되어 인스턴스화 될 때까지 조회를 지연합니다. 이 두 가지 사실은 그것이 작동하기 위해 필요합니다.

+0

예! "this->"는 작동하며 설명하는 이유 때문에 더 확실한 선택입니다. doh! 감사합니다. –

0

는 어쩌면 그것은 uint32 타입 정의와 단지 문제입니다. 그것은 새로운 환경에서 사용할 수 없다는 것일 수 있습니다. 첫 번째 경우 네임 스페이스 해상도는 NEngine :: uint32를 선택합니다. 두 번째 경우에는 아무 것도 선택하지 않습니다 (따라서 구문 분석 오류).

Windows에서 uint32가 정의 된 방법을 찾고 해당 정의를 복사 해보는 것이 좋습니다.

-1

아마 당신은 당신의 간격을 일치시키지 않았기 때문입니다. CSimpleTable<CSimpleKey<T>> 대신 을 입력하셨습니다. 나는 둘 다 유효해야한다고 생각하지만 아마도 파서 버그가 관련되어있을 것이다.

편집 : 자동 인수 유형 추론 경로로 향하게하고 명시된 특수화를 잘라낼 수도 있습니다.

+0

두 번째는 시프트 토큰으로 해석되기 때문에 유효하지 않습니다. 이것이 공간이 존재하는 이유입니다. 공간은 두 개의 결과적인 토큰으로 해석되어야합니다. –