나는 정의 할 수 있도록하려면템플릿 기반 함수 오버로드가 다른 기본 클래스의 파생 클래스를 허용하는 방법?
template <class TX>
void f(const TX &x){ ... }
template <class TY>
void f(const TY &x){ ... }
TX는 BaseX 및 TY에서 파생되어야합니다
는 BaseY (어떻게 이런 종류의 일을 지정합니까?)에서 파생되어야하고, 내가 전화를 할 수 있도록하려면 그것으로
f(DerivedX<T>())
내가 템플릿 매개 변수를 지정하지 않도록하는 것이 가장 중요합니다. 이것이 가능합니까? 그렇다면 어떻게 구현할 수 있습니까? 가능하지 않다면 템플릿 함수가 특정 유형 만 받아 들일 수 있도록하는 방법이 있습니까?하지만 여전히 암시 적으로 인스턴스화해야합니까? 나는 파생 클래스 '타입이 필요하기 때문에 기본 클래스를 수락하는 오버로드를 만들 수 없습니다.
부록 - enable_if가하는 것은 조건이 참이면'type' 멤버 만 있기 때문에'type'을 사용하려고하면 조건을 false로 컴파일하면 컴파일 오류가 발생합니다. 그러나 SFINAE (대체 오류는 오류가 아님)로 알려진 원리 때문에 컴파일러에서 해당 버전의 템플릿을 선택하지 말라고 알려줍니다. 'BaseY'에 다른 템플릿이 있으면 컴파일러는 두 템플릿 중 하나를 생성하지 못하고 다른 템플릿을 사용해야합니다. 유일하게 적합한 템플릿이므로 선택됩니다. – coppro
좋아, 나는 그걸 읽었고, 나는 그들이 내가 한 것 같다. 그러나 나열된 코드는 컴파일되지 않습니다. –
죄송합니다. 복사하여 붙여 넣기에 실패했습니다. 다시 시도하십시오 ('f'의 정의에서 여분의'void '를 제거했습니다). ''f (y);'라는 줄을 제거하면 컴파일러 에러를 일으키는 것을 보여주기 때문에 컴파일해야합니다. –