2014-06-18 4 views
4

템플릿 기본 구문의 구문에 대한 질문을 많이 받았습니다. 기본 템플릿 인수는 어떻게 작동합니까?

template <class T = SomeDefault> class T1 {}; 

최근 나는 그것의 mapped_vector에서 사용하는지도 구현 부스트 확인하고 싶어서 :

일반적으로 (작동 방법에 대한 이해와 동기화에) 대답은 그런 일을 사용하는 것입니다.

template<class T, class A> 
class mapped_vector: 

는 분명히, 인수 A 바인딩 디폴트가없는, 또한 분명히, 난 그냥 벌금 mapped_vector<int>를 인스턴스화 할 수 있습니다 : 그리고 다음 코드를 발견했다. Obviosuly 기본 인수가 어떻게 든 추정되지만, 어떻게?

편집 : 그냥 내가 템플릿 선언 (Xeo의 링크 @) this file

+2

이 클래스 템플릿은 어딘가에 정의 – lisyarus

+0

은 기본 인수 가능성이 일부 헤더 선언에 할당되기 전에 실제 기본 템플릿 인수로 선언 할 수있다. – Xeo

+0

[여기] (https://github.com/boostorg/ublas/blob/master/include/boost/numeric/ublas/fwd.hpp#L105) – Xeo

답변

6

라인 here에 라인 279에 대해 이야기하고, 정확합니다. 링크의 라인 입니다. 참고 : 당신이 을 다시 정의 할 수 없다면 선언을하기로 결정한 것입니다.

이 작동 : (부스트의 버전)

template<typename T = int> class A; 
template<typename T> class A {}; 

This won't work :

template<typename T = bool> class A; 
template<typename T = int> class A {}; 

This neither : 당신이

template<typename T = int> class A; 
template<typename T = int> class A {}; 

참고 하나를 선언합니다. This works : 기본은 한 번만 선언 할 수 있지만

template<typename T> class A; 
template<typename T = int> class A {}; 

, 그들은 모두 같은 부분에 선언 할 필요가 없습니다. This works,하지만 그렇게하지 마십시오 :

template<class T, class U = bool> class A; 
template<class T = int, class U> class A {}; 

... 실제로 제한이 없습니다. This works : (비난 - 또는 감사 - @Xeo는)

template<class T, class U, class V = double> class A; 
template<class T, class U = bool, class V> class A; 
template<class T = int, class U, class V> class A {}; 

그리고 물론

, 당신은 선언을 포함하도록 강요 아닙니다. This works :

template<typename T = int> class A {}; 
관련 문제