템플릿 다형성: 템플릿이 제대로 작동하지 않는 경우
C에서 템플릿은 일반 프로그래밍을 위한 강력한 메커니즘을 제공합니다. 그러나 다형성 동작에는 제한이 있습니다. 이 문서는 특정 시나리오에서 템플릿 다형성 부족에 관한 질문에 답합니다.
쿼리
사용자가 생성자를 호출할 때 "일치하는 함수 없음" 오류가 발생합니다. 이는 Container
다형성 탐구
다형성을 사용하면 서로 다른 클래스의 개체를 공통 기본 클래스의 객체로 처리됩니다. 그러나 이 동작은 C의 템플릿으로 확장되지 않습니다. Foo는 Interface에서 파생되었음에도 불구하고 자동으로 Container
템플릿의 비공분산
여기서 핵심 측면은 템플릿 공분산이 부족하다는 것입니다. 공변 템플릿에서 파생 유형은 기본 유형을 예상하는 템플릿에 대한 유효한 인수로 자동으로 간주됩니다. 그러나 C에서는 템플릿이 공변적이지 않습니다.
공분산의 결과
다음 예를 고려하세요.
class Fruit {...}; class Apple : public Fruit {...}; class Orange : public Fruit {...}; std::vector<Apple>& apple_vec; // Vector of apples std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!
설명에서 알 수 있듯이 , 템플릿을 공변적으로 처리하면 호환되지 않아야 하는 유형이 호환되는 것으로 처리되어 유형 안전성을 깨는 상황이 발생할 수 있습니다.
대체 솔루션
공변 템플릿은 다음에서 지원되지 않습니다. C, 대체 솔루션을 채택해야 합니다. 정적 어설션 또는 제한된 와일드카드(Java에서 사용 가능)를 사용하여 필수 유형 관계를 적용할 수 있습니다. 쿼리에 언급된 특정 시나리오에서 간단한 정적 어설션은 전달된 컨테이너 유형이 실제로 컨테이너<인터페이스>인지 확인할 수 있습니다.
위 내용은 'Container'를 기대하는 생성자에게 'Container'를 전달할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!