귀하의 의도는 다음의 요소를 인쇄할 수 있는 일반 함수인 print_container를 만드는 것입니다. 스택 및 큐 컨테이너 모두. 그러나 컨테이너 유형을 확인하기 위해 std::is_same을 사용했음에도 불구하고 함수에 오류가 발생합니다.
오류 원인:
오류는 if의 두 분기 모두에서 발생합니다. -else 문은 컴파일 가능해야 합니다. 귀하의 경우 Cont가 std::stack이면 std::stack에 존재하지 않는 앞부분 멤버 함수에 액세스됩니다. 마찬가지로 Cont가 std::queue인 경우 std::queue에 없는 최상위 멤버 함수에 액세스합니다.
부분 특수화 솔루션:
한 가지 가능한 해결책은 부분 특수화를 사용하여 각 컨테이너 유형을 개별적으로 처리하는 것입니다.
<br>template <typename Cont><br>struct element_accessor;</p> <p>template <typename T><br>struct element_accessor<std::stack<T>> {<br> const T& 연산자()(const std::stack<T>& s) const { return s.top(); }<br>};</p> <p>템플릿 <typename T><br>struct element_accessor<std::queue<T>> {<br> const T& 연산자()(const std::queue<T>& q) const { return q.front(); }<br>};</p> <p>template<typename Cont><br>void print_container(Cont& cont){<br> while(!cont.empty()){</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> auto elem = element_accessor<Cont>{}(cont); std::cout << elem << '\n'; cont.pop();
}
}
이 접근 방식은 각 컨테이너 유형에 대해 올바른 접근자를 제공하는 특수한 element_accessor 함수에 요소 검색을 위임합니다.
C 17 if constexpr을 사용한 솔루션:
C 17 이상을 사용하는 경우 if constexpr 구성:
<br>template<template<을 활용할 수도 있습니다. ;클래스> typename Cont, typename T><br>void print_container(Cont<T>& cont){<br> while(!cont.empty()){</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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();
}
}
이 솔루션은 if constexpr을 사용하여 컨테이너 유형에 따라 적절한 코드를 조건부로 실행하므로 부분 특수화가 필요하지 않습니다.
위 내용은 내 함수가 `std::is_same`을 사용하여 여러 컨테이너 유형을 처리할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!