問題タブ [explicit-specialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ソース ファイル内のメンバー関数テンプレートの明示的な特殊化
メンバー テンプレート関数を持つクラスがあります。
そして、Writer のソース ファイルに、次の明示的な特殊化を追加しましたsome_type
。
これは機能します...時々。正しいタイプであることを確実に確認したとしても:
明示的な特殊化が呼び出されることもあれば、プライマリが呼び出されることもあります。何を与える?
haskell - Haskell で用語がどこから来るかのコンテキストを指定する
ダミーの例を次に示します。
Haskell は次のように言います。
エラーは、Haskell が型変数を推測できないという事実から発生し、解決策はtypeclass の定義からb0
パラメーターを削除することです。でも、現実には、できません。b
Test
私の質問は次のとおりです。行で指定されたb0
明示的なパラメーターで明示的に識別する方法はありますか?b
f :: Test a b => a
ありがとう。
c++ - オーバーロード演算子 '<<' (左シフト) の明示的な特殊化
列挙型に基づいて演算子をオーバーロードしたいクラスがあるとしましょう:
これにより、g++ と clang++ の両方で (実際にかなりのダンプを実行するという事実を無視して) クリーンにビルドされます。
「<<」演算子を同じようにオーバーロードしたい場合はどうすればよいですか? 同様のアプローチは機能しないようです。
g++ によると、メインからオペレーターへの呼び出しは無効です。
一方、clang++ は別のエラー メッセージを生成します。
これは、標準ライブラリからの「<<」のオーバーロードの可能性をリストし続けます(私が正しく理解していれば)、次のようになります。
何が起こっている?この種のオペレーターの専門化は可能/許可されていますか? もしそうなら、オペレーターを呼び出す適切な方法は何ですか? または、clang は正しく、定義の形式が正しくありませんか?
c++ - クラスを特殊化せずにメンバーの明示的な特殊化が許可されないのはなぜですか?
C++ 標準には次のように記載されています。
クラス テンプレートのメンバーまたは名前空間スコープに表示されるメンバー テンプレートの明示的な特殊化宣言では、メンバー テンプレートとその外側のクラス テンプレートの一部は、特殊化されていないままになる場合があります。囲んでいるクラス テンプレートも明示的に特殊化されていません。(C++11 以降では 14.7.3/16、古い標準では 14.7.3/18)
これは、次のことができないことを意味します。
これに関連する問題を抱えている人々の質問がすでに複数あり、多かれ少なかれ「標準はそう言っている」と答えています。私が本当に理解していないのは、この制限が存在する理由です。
c++ - template メソッドの template-template-parameter 推定に失敗しました (ただし、明示的に特化されています)
C++ で拡張可能な小さなスクリプト インタープリターを作成しようとしています。その目的のために、関数ハンドラがディスパッチ テーブルに挿入されます。私の質問を簡単にするために、handlertype は次のように定義されます (実際のコードでは、これには引数リストと戻り型のパラメーターが含まれます)。
現時点では、ディスパッチ テーブルは単純な順序付けされていないマップであり、オーバーロードを実装するためのキーとして (一種の) マングルされた名前があります。
メソッドはこのテーブルに直接追加されます。たとえば、タイプの 2 つの引数を取る単純なメソッドのようにint
(operator+ii
私の場合、これは管理された名前です):
ただし、多くのハンドラー、特に基本的な数学に関連するハンドラーは、さまざまな引数を受け入れ、 と のすべての組み合わせint
がdouble
有効であり、4 つのメソッドと 4 つのディスパッチ テーブル エントリが生成されます。したがって、テンプレートを使用してこれらのメソッドを実装することにしました。例を挙げると、これは基本的に次のようになります (これも単純化されています)。
ディスパッチ テーブルは次のように埋められます。
まだ入力することがたくさんありますが、これで問題ありません。とにかく、テンプレート パラメーターとメソッド シグネチャ (マングルされた名前) の間には明らかに相関関係があるため、これを自動化して記述できるようにしました (パラメーター名のマンゲリングは handler_provider::add 内で行われます)。
次に、最初に引数を取り、2番目のタイプのテンプレート引数として受け取ります(そのため、<int, int>
パーツを2回入力する必要はありません)。
明確にするために。私は、次のmy_add_handler
ようにテンプレートを明示的に特殊化することを認識しています。
しかし、私が省略したいのはまさにこの重複です( twict <int,int>
)。
ただし、最後の部分でエラーが発生し続けます。メソッドは次のhandler_provider::add
ように定義されます (上記のパラメーター名のマンゲリングは、ここでのポイントではなく、期待どおりに機能するため省略されています)。
前述のように、最初のオーバーロードは、上記で説明した正確なケースを想定しています。以下のハンドラーは、非テンプレート関数と完全に特殊化された関数をインストールします。
ただし、これによりエラーが発生し、上記のような呼び出しからの内部テンプレートを推測できないことがわかります。コンパイラに何かを推測するように指示したとは思いませんでした。呼び出しでテンプレート引数を完全に特殊化しました (再び)。
外側の可変個引数テンプレートの引数class... Ts
は明示的に名前が付けられ<int, int>
、内側のテンプレート テンプレートの単純な引数は as という名前が付けられmy_add_handler
ます。ただし、コンパイラはこれを無視しているようです(?)。これは私が得る出力です( gcc 5.4.0 using -std=c++14
):
2 番目のエラーが表示されます。これは完全に問題なく、テンプレート タイプのオーバーロード解決からこのオーバーロードを除外する必要があるため、問題にはなりません。最初のエラーは、私を狂わせるエラーです。
Clang (3.9.0) はもう少し正確です:
しかし、ここでどこが間違っているのかまだわかりません。私は何が欠けていますか?
ありがとう、
セバスチャン
より良いテストのために、完全な例を次に示します。