2012-01-11 3 views
3

예 :명시 적 특수화와 부분 전문화의 구문이 다른 이유는 무엇입니까?

template <typename T, typename U> 
struct A { 
    void Print() {} 
}; 

template <> 
void A<int, float>::Print() {} // Okay     

template <typename T> 
void A<T, char>::Print() {} // Will produce error 

질문 :

나는 당신이 작동하려면 위의 코드에서 클래스 템플릿 부분 특수화를 정의해야하고 나는 또한 The members of the class template partial specialization are unrelated to the members of the primary template (§ 14.5.5.3) 그 표준에서 알고있는 것을 알고있다. 그러나 Explosation 전문화와 부분 전문화의 구문이 다른 이유는 무엇입니까?

답변

0

기능 템플리트를 부분적으로 만 전문화 할 수는 없습니다.

첫 번째 인스턴스는 클래스 템플릿의 멤버 함수 자체가 함수 템플릿이기 때문에 이러한 제한이 적용됩니다.

클래스 템플릿을 부분적으로 특수화하면 전혀 새로운 클래스 템플릿이 만들어 지므로 새로 정의해야합니다.

+1

"클래스 템플릿의 함수 자체가 함수 템플릿"- 클래스 외부에 정의 된 클래스 템플릿의 멤버 함수는 * 함수 템플릿처럼 정의됩니다. 그러나 그들은 정말로 동등한가? –

+0

@Jesse no 그들은 동등하지 않습니다. 클래스 템플릿의 멤버 함수의 "templatiness"를 설명하는 용어는 없습니다. 그것들은 함수 템플릿이 아닙니다. 어떤 사람들은 그들을 "temploid"라고 부릅니다. 해당 문제는 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1253 –

+0

입니다. @ JohannesSchaub-litb : 해명 해 주셔서 감사합니다. 잘하면 활성 문제에 대한 설명이 곧 추가됩니다. –

0
template <typename T> 
void A<T, char>::Print() {} // Will produce error 

당신은 다음과 같습니다

  1. 재 정의하는 기능 (이미 void Print() {}를 선언 할 때 정의, 당신은 {}가 참조 된 일치하지 않는 템플릿 인수 목록에
  2. 합니다. 선언 : template <typename T, typename U> void Print()

실제로 선언 한 기능을 정의하지 않은 경우에도 선언과 정의가 일치하지 않기 때문에 오류가 발생합니다. 컴파일러는 원본 템플릿에 대한 정의 또는 특수 템플릿에 대한 선언을 찾을 수 없습니다.

뿐만 아니라 전문 구조체가 있어야합니다 구조체에 관련되는 함수에 대한 전문 템플릿 함수는,이 코드는 작동 : 템플릿 함수가 템플릿 구조체의 선언 된

template <typename T, typename U> 
struct A { 
    void Print() {} 
}; 

template <> 
void A<int, float>::Print() {} // Okay     


template <typename T> 
struct A<T,char> 
{ 
    void Print(); 
}; 

template <typename T> 
void A<T,char>::Print() {} 

때문입니다.

+0

이 설명에 대해 확실하지 않습니다. 표준 템플릿의 인용문은 다음과 같습니다.'기본 템플릿의 멤버 정의는 클래스 템플릿 부분 전문화의 멤버에 대한 정의로 사용되지 않습니다 .' –

+0

견적과 설명 사이에 반대 의견이 없습니다. 요점은 무엇입니까? 있니? –

+1

're-defining'에 대해 언급했지만 클래스 템플릿 전문화는 기본 템플릿과 관련없는 별개의 템플릿이므로 재정의가 필요하지 않습니다. 컴파일러는'A '을 볼 때 특별한 정의를 기대합니다. 그것을 컴파일하고 오류를 보려고 했습니까? 함수를 선언 할 때 함수를 정의하지 않더라도 동일한 오류가 발생합니다. (오류가 항상 내게 말하는 것을 신뢰해서는 안됩니다.) –

관련 문제