print_container 関数が失敗する理由を理解するには、std::is_same テンプレートのプロパティを分析する必要があります。この関数は 2 つの型を比較し、それらが同一であれば true を返します。この場合、std::is_same を使用して、コンテナー タイプ Cont がスタックまたはキューと同じかどうかを判断します。ただし、if-else ステートメントの分岐はコンテナの正確な型に依存し、両方の分岐がコンパイル可能である必要があるため、コンパイル エラーが発生します。
解決策 1: 部分的な特殊化
解決策の 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 中国語 Web サイトの他の関連記事を参照してください。