>백엔드 개발 >C++ >'Container'를 기대하는 생성자에게 'Container'를 전달할 수 없는 이유는 무엇입니까?

'Container'를 기대하는 생성자에게 'Container'를 전달할 수 없는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-30 08:23:27354검색

Why Can't I Pass a `Container` to a Constructor Expecting `Container`?

템플릿 다형성: 템플릿이 제대로 작동하지 않는 경우

C에서 템플릿은 일반 프로그래밍을 위한 강력한 메커니즘을 제공합니다. 그러나 다형성 동작에는 제한이 있습니다. 이 문서는 특정 시나리오에서 템플릿 다형성 부족에 관한 질문에 답합니다.

쿼리

사용자가 생성자를 호출할 때 "일치하는 함수 없음" 오류가 발생합니다. 이는 Container& 유형의 매개변수를 취합니다. 생성자는 Bar 클래스 내에 정의되며 사용자는 Container의 인스턴스를 생성합니다.

다형성 탐구

다형성을 사용하면 서로 다른 클래스의 개체를 공통 기본 클래스의 객체로 처리됩니다. 그러나 이 동작은 C의 템플릿으로 확장되지 않습니다. Foo는 Interface에서 파생되었음에도 불구하고 자동으로 Container를 만들지 않습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.