2009-08-19 4 views
5

"는 형식이 아닙니다"나는 선언 :그램는 ++ 오류 템플릿 기반 기능을 작성

template <typename T> 
T invertible(T const& container, T::size_type startIndex, T::size_type endIndex); 

4.0.1 ++ g로 컴파일 내가 오류 가지고 : 당신은 유형 이름을 추가 할 필요가

error: 'T::size_type' is not a type 

답변

7

T :: size_type 접두사가 typename이어야합니다. 왜? "C++ Templates: The Complete Guide"

The language definition resolves this problem by specifying that in general a dependent qualified name does not denote a type unless that name is prefixed with the keyword typename.

... The typename prefix to a name is required when the name

  1. Appears in a template
  2. Is qualified
  3. Is not used as a list of base class specifications or in a list of member initializations introducing a constructor definition
  4. Is dependent on a template parameter

Furthermore the typename prefix is not allowed unless at least the first three previous conditions hold.

+0

나는 그 구절을 읽었습니다. 감사합니다 (집에서 읽는 사람들은 130 쪽의 상세한 설명을 볼 수 있습니다). 나는 여전히 "typename"이 인자 선언에 필요하다는 것을 알지 못한다. 왜냐하면 이것은 타입이어야하기 때문이다. 그러나 아마 이것은 일반적인 문장과의 일관성을 위해서 일 것이다. –

+1

@wnissen : 일반적으로 파서 빌더를 행복하게 만드는 그러한 요구 사항이 있습니다. 문제의 일부는 분명히 이미 인수 선언임을 알고있는 것입니다. "가장 복잡한 구문 분석"문제로 인해 파서는 일반적으로() 사이의 토큰에서 파서를 추론해야합니다. 자,() 사이의 토큰에 대한 해석이 인수 선언이라는 것에 달려 있다고 말하면 순환 파싱 문제가 생겼습니다. – MSalters

29

합니다.

e.e.

template <typename T> 
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex); 

형식 T에 대한 정보가 없어도 컴파일러는 T :: size_type이 형식을 지정한다는 것을 알아야합니다. 표준에서

, 섹션 14.6.2은 :

A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename .

0

내가 T :: 말하자면 size_type은 유형 이름임을 지정하는 데 필요한 밝혀졌다. 왜 그런가요?

template <typename T> 
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex); 
+0

에서

는 가능한 인스턴스 이름과 가능한 유형 이름 사이에 명확합니다. 더 많은 정보는 C++ Templates; 완전한 가이드 - 정보는 http://www.josuttis.com/tmplbook/tmplbook.html –

+1

에 나와 있으며 별도의 질문이어야합니다. (이전에 물어 보았지만. 조금 주위를 검색하십시오.) – jalf

3

템플릿 선언을 파싱하는 동안 T는 알 수 없기 때문에. 컴파일러는 T :: size_type이 존재하는지 전혀 모릅니다. 예를 들어 정적 변수를 참조 할 수 있습니다. 나중에 템플릿을 사용할 때 T는 물론 알려지지 만 오류는 더 일찍 발생합니다. 그리고 gcc 4.0.1보다 덜 오래된 것을 사용하십시오 .--)

편집 : -fpermissive로 컴파일하면 컴파일러가 코드를 씹을 수 있지만 경고를 보냅니다.

+0

gcc 4.0.1이 가장 최근의 것입니다 : – Tobias

+1

사실이라면, 맥을 사용하지 않은 또 다른 이유입니다. 최신 프로덕션 품질 g ++는 4.4.0 –

+0

입니다. 실제로 gcc 4.4.1입니다. – hirschhornsalz