函數失敗的原因以及如何解決問題
提供的程式碼嘗試建立一個可以列印堆疊和佇列的通用函數。然而,它由於一個根本問題而失敗: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中文網其他相關文章!