문제

종속 기본 클래스에서 유형 이름을 가져 오는 데 해설을 사용하지 않는 이유를 아는 사람이 있습니까? 그들은 멤버 변수와 함수에 대해 작동하지만 적어도 GCC 4.3에서는 유형에 대해 무시되는 것 같습니다.

template <class T>
struct Base
{
  typedef T value_type;
};

template <class T>
struct Derived : Base<T>
{
  // Version 1: error on conforming compilers
  value_type get();

  // Version 2: OK, but unwieldy for repeated references
  typename Base<T>::value_type get();

  // Version 3: OK, but unwieldy for many types or deep inheritance
  typedef typename Base<T>::value_type value_type;
  value_type get();

  // Version 4: why doesn't this work?
  using typename Base<T>::value_type;
  value_type get(); // GCC: `value_type' is not a type
};

여러 수준의 상속 전반에 걸쳐 상속하고 싶은 할당 자 스타일의 타이프 페프 세트가있는 기본 클래스가 있습니다. 내가 지금까지 찾은 가장 좋은 솔루션은 위의 버전 3이지만 버전 4가 작동하지 않는 이유가 궁금합니다. GCC는 사용 설명을 수용하지만 무시하는 것 같습니다.

C ++ 표준 C ++ Prog를 확인했습니다. 랭. 제 3 판. [Stroustrup] 및 C ++ 템플릿 [Vandevoorde, Josuttis]이지만, 종속 기본 클래스 유형에 해고를 사용하는 것이 적용될 수 있는지 여부는 다루지 않는 것 같습니다.

다른 예를 보는 데 도움이되는 경우 여기에 같은 질문이 있습니다, GCC 메일 링리스트에서 실제로 답변되지 않았습니다. Asker는 자신이 '타이프 이름을 사용하여'다른 곳에서 보았지만 GCC는 그것을 지원하지 않는 것 같습니다. 테스트 할 수있는 다른 준수 컴파일러가 없습니다.

도움이 되었습니까?

해결책

Richard Corden이 지적 했듯이이 문제는 C ++ 표준 핵심 언어 결함 보고서 2003 년 표준이 비준 된 후 : 키워드 타이프 이름/템플릿은 선언 사용과 어떻게 상호 작용합니까?

제안 된 결의안 (2003 년 4 월, 2003 년 10 월 개정) :

7.3.3 [namespace.udecl]의 맨 아래에 새 단락을 추가하십시오.

사용 설명이 키워드 타이프 이름을 사용하고 종속 이름 (14.7.2 [temp.dep])을 지정하는 경우 사용 설명에 의해 소개 된 이름은 typedef-name (7.1.3 [dcl.typedef])로 취급됩니다. .

이 텍스트는 2003 년 10 월 15 일부터 두 번째 판 표준에 나타나지 않는 것 같습니다.

GCC는 아직이 해상도를 구현하지 않습니다. 버그 14258:

------- 주석 #3 Giovanni Bajo 2004-02-27 12:47 [Reply] ------- 문제는 우리의 Using_decl이 "typeName"을 기록하지 않는다는 것입니다. 그것이 사실입니다. 그것은 그것을 통해 가져 오는 유형입니다. 이것은 암시 적 유형 이름 확장 덕분에 작동하는 데 사용되었습니다.

복제하다 버그 21484 'TypeName 사용'은 COMEAU 및 Intel 컴파일러에서 작동 함을 나타냅니다. MSVC는 모든 이름을 종속으로 취급하기 때문에 구성은 해당 컴파일러에 대해 불필요하지만 허용됩니다.


결정된 2011 년 12 월 13 일 GCC 4.7에서!

다른 팁

base :: value_type에 대한 typedef를 선언하기 전에 기본 템플릿에 액세스 지정자 (public/protected/private)를 포함하지 않았습니다. 결과적으로 기본적으로 비공개로 기본적으로 기본에서 파생 된 클래스에서는 액세스 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top