나는 보통 내 클래스와 템플릿을 선언 한 다음 (같은 헤더 파일에서) 메소드를 정의합니다. 나는 그 방법을 읽기가 더 쉽다. 글쎄, 클래스 밖의 정의에 사용할 작업 형식 서명을 파악할 수없는 경우를 발견했습니다. 여기에 내가 뭘하는지의 간단한 예입니다, 그게 문제 보여enable_if'ed 템플릿 템플릿 생성자의 유형 시그니처입니까?
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
(Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
내가 일치하는 서명을 얻으려고하는 WHAT_GOES_HERE
슬롯에 여러 가지를 시도, 그리고 나는 계속 실패. 하나의 T가 두 객체에 전달되는 경우와 한 쌍의 반복자에서 전달되는 경우를 구별하기 위해 enable_if가 필요합니다. 이 코드는 템플릿 생성자가 기본 템플릿 내부에 정의되어있는 경우 코드가 올바르게 작동하지만 코드가 현재 수행하는 방식이지만 선언 외부에서 정의를 이동하는 것이 좋습니다.
편집 : enable_if < ...이> 당신이 할 수없는 그 유형에 대한 기본 값을 할당하기 때문에 나는, 정의에> ... < enable_if 난 그냥 수 없음을 다시 사용을 언급해야한다 선언이 아닌 정의.
당신이 정말이에 대한 SFINAE가 필요하십니까? 두 번째 생성자를 'template Foo (U first, U last);'로 선언 한 경우, 호출자가'T '유형의 두 객체를 전달하면 첫 번째 생성자가 여전히 선택됩니다. –
타입 T는 일반적으로 산술 타입이며 T가 부호가없고 그 반대의 경우 int에 전달할 수 있고 템플릿 생성자가 호출되지 않도록하고 싶습니다 (이전에 enable_if를 사용하기 전에 발생했습니다) – swestrup
실제로, 당신은 기본값을 전혀 지정하지 않습니다. 템플릿의 두 번째 매개 변수는'enable_if>'입니다. 당신이'int'를 기대하는 것과 같습니다. 그것은 컴파일되지 않아야하며 확실히 사용할 수 없습니다. –