문제

C ++로 임박한 템플릿을 작성할 수 있습니까? 즉, 동일한 템플릿 매개 변수에 대해 다른 결과 유형 또는 int를 제공하는 템플릿입니다. 예를 들어 템플릿을 작성할 수 있습니다. Foo<T> 어디 Foo<int>::type 때때로 char 그리고 다른 시간에 float? 또는 템플릿 Foo<T> 어디 Foo<double>::my_static_const_int 때때로 10과 다른 시간은 20인가요?

도움이 되었습니까?

해결책

불가능합니다. 그런 식으로 동작하는 템플릿이있는 경우 ODR 및 / 또는 기타 규칙을 위반합니다. 예 : 전문화가 인스턴스화되기 전에 선언되어야합니다. 따라서 TypEdef 멤버를 변경하여 다음 모든 참조에 대해 다른 유형으로 해결할 수있는 전문화를 할 수는 없습니다.

기억 Foo<T> if 클래스를 참조하십시오 Foo 클래스 템플릿입니다. 클래스의 TypEdef 멤버가 프로그램의 한 지점에서 하나의 유형으로, 다른 시점에서 다른 유형으로 정의되면 무언가 잘못되었을 것입니다. 다음은 이것에 관한 다양한 표준 인용문입니다


함수 템플릿, 멤버 함수 템플릿 또는 클래스 템플릿의 멤버 함수 또는 정적 데이터 구성원의 전문화는 번역 단위 내에 여러 개의 인스턴스베이션을 가질 수 있습니다. 클래스 템플릿의 전문화는 번역 단위 내에서 최대 1 지점의 인스턴스화를 가지고 있습니다. 임의의 템플릿에 대한 전문화는 여러 번역 단위의 인스턴스화 지점을 가질 수 있습니다. 하나의 정의 규칙 (3.2)에 따라 두 가지 다른 인스턴스화 지점이 템플릿 전문화의 다른 의미를 제공하는 경우, 프로그램은 잘못 형성되어 진단이 필요하지 않습니다.


템플릿, 멤버 템플릿 또는 클래스 템플릿의 구성원이 명시 적으로 전문화되는 경우, 해당 전문화가 처음 사용되기 전에 해당 전문화가 선언되어 암시 적 인스턴스화가 발생하여 그러한 사용이 발생하는 모든 번역 단위에서 발생합니다. ; 진단이 필요하지 않습니다.


(다양한 "노이즈"건너 뛰기)

.. 전체 프로그램에서 배수로 정의 될 수있는 대담한 엔티티 ..]. D라는 기업이 하나 이상의 번역 장치에 정의 된 기업을 감안할 때

  • d의 각 정의는 동일한 시퀀스의 토큰으로 구성되어야한다.
  • D의 각 정의에서, 3.4에 따라 찾은 해당 이름은 D의 정의 내에 정의 된 엔티티를 지칭하거나, 과부하 해상도 (13.3) 후 및 부분 템플릿 전문화 (14.8)와 일치 한 후 동일한 엔티티를 참조해야한다. .삼)...
  • D가 템플릿이고 하나 이상의 번역 단위에 정의 된 경우, 위 목록의 마지막 4 가지 요구 사항은 템플릿 정의 (14.6.3)에 사용 된 템플릿의 동봉 범위의 이름과 종속 이름에도 적용됩니다. 인스턴스화 시점 (14.6.2). D의 정의가 이러한 모든 요구 사항을 충족시키는 경우, 프로그램은 D의 단일 정의가있는 것처럼 행동해야합니다. D의 정의가 이러한 요구 사항을 충족시키지 못하면 동작이 정의되지 않습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top