函数失败的原因以及如何解决问题
提供的代码尝试创建一个可以打印堆栈和队列的通用函数。然而,它由于一个根本问题而失败:if-else 语句的两个分支都必须是可编译的。在这种情况下,它们不是。
发生错误的具体原因是 top() 成员函数仅适用于堆栈,而 front() 成员函数仅适用于队列。当尝试为同一容器类型编译两个分支时,编译器会标记该问题,因为它无法确定要使用哪个成员函数。
此问题的一种解决方案是使用部分特化。部分专业化允许您为特定类型或类定义模板的不同实现。在这种情况下,您可以为堆栈和队列定义部分特化,确保每个实现都有适当的成员函数:
<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 来访问每个容器类型的适当成员函数。通过为堆栈和队列提供部分特化,您可以确保为每种情况编译正确的代码。
C 17 及更高版本中可用的另一个解决方案是使用 if constexpr:
<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>
该解决方案利用 constexpr 条件表达式根据容器类型选择正确的代码。通过在编译时检查 Cont 的类型,可以确保为每个容器调用正确的成员函数。
以上是为什么我的打印堆栈和队列通用函数失败,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!