print_container 함수가 실패하는 이유를 이해하려면 std::is_same 템플릿의 속성을 분석해야 합니다. 이 함수는 두 유형을 비교하여 동일하면 true를 반환합니다. 이 경우 std::is_same을 사용하여 Cont 컨테이너 유형이 스택 또는 큐와 동일한지 확인합니다. 그러나 if-else 문의 분기는 컨테이너의 정확한 유형에 따라 달라지며, 두 분기 모두 컴파일 가능해야 하므로 컴파일 오류가 발생합니다.
해결책 1: 부분 특수화
한 가지 해결책은 부분 특수화를 사용하여 스택 및 대기열 유형에 대한 element_accessor의 별도 구현을 생성하는 것입니다. 이를 통해 특정 컨테이너 유형을 기반으로 요소 추출을 처리할 수 있습니다. 구현 예는 다음과 같습니다.
<code class="cpp">template <typename Cont> struct element_accessor; template <typename T> struct element_accessor<std::stack<T>> { const T& operator()(const std::stack<T>& s) const { return s.top(); } }; template <typename T> struct element_accessor<std::queue<T>> { const T& operator()(const std::queue<T>& q) const { return q.front(); } }; template<typename Cont> void print_container(Cont& cont){ while(!cont.empty()){ auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop(); } }
이 솔루션에서 element_accessor는 스택의 최상위 요소와 대기열의 전면 요소에 액세스하는 일관된 방법을 제공하여 유형 불일치 문제를 해결합니다.
해결책 2: if constexpr(C 17)
C 17 이상을 사용하는 경우 if constexpr 구문을 활용하여 템플릿 유형 매개변수를 기반으로 분기를 구현할 수 있습니다. 다음은 print_container 함수의 수정된 버전입니다.
<code class="cpp">template<template<class> typename Cont, typename T> void print_container(Cont<T>& cont){ while(!cont.empty()){ if constexpr (std::is_same_v<Cont<T>, std::stack<T>>) std::cout << cont.top() << '\n'; else if constexpr (std::is_same_v<Cont<T>, std::queue<T>>) std::cout << cont.front() << '\n'; cont.pop(); } }</code>
이 버전에서 if constexpr 분기는 템플릿 유형 매개변수를 기반으로 컴파일 타임에 평가됩니다. 이는 부분 전문화의 필요성을 제거하고 유형 안전성을 보장합니다.
위 내용은 `print_container` 함수에서 발생하는 유형 불일치 오류를 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!