問題タブ [overload-resolution]
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# - デフォルトのパラメーターとジェネリックに関するメソッド解決の問題
.NET 4 を使用して、以下のサンプルの最初のメソッド呼び出しをコンパイラが解決できないことに混乱しています。
誰でもこれに光を当てることができますか?(上記のように) コンパイラを支援するために API を変更する以外に、ここで前進する方法はないと思いますExtensions3
が、より簡単でより良い方法がある場合は、それを聞いてみたいです.
c# - C# でメソッドのオーバーロードを解決する際の優先順位の規則は何ですか?
IEnumerable<T>
メソッドのオーバーロードを広範囲に使用したり、から派生した型のオブジェクトをシリアル化したりするシリアライザーを作成しIDictionary<K,V>
ています。
dynamic
また、キーワードを使用して、シリアル化するオブジェクトの実行時の型に基づいて CLR が正しいオーバーロードを選択できるようにするつもりです。
このコード スニペットを見てください。
そして、私はこれをしたい:
のランタイム タイプに基づいてobj
、正しいオーバーロードが呼び出されるようになりました。例えば、
この場合、3 番目のオーバーロードが呼び出されます。論理的根拠は非常に単純です。これは実行可能なオプションにすぎません。
ただし、これを行うと:
最初のオーバーロードを呼び出します。私はこれを正確に理解していません。3 つのオーバーロードすべてが実行可能なオプションであるのに、最初のオーバーロードに解決されるのはなぜですか?
実際、最初のオーバーロードを削除すると 2 番目のオーバーロードが呼び出され、1 番目と 2 番目のオーバーロードを削除すると 3 番目のオーバーロードが呼び出されます。
メソッドのオーバーロードを解決する際の優先規則は何ですか?
c# - 非仮想メソッドの解決 - なぜこれが起こっているのですか
非仮想メソッドがどのように解決されるかについて (C# で) 私の理解では、それは (インスタンスの型ではなく) 変数の型に依存するということです。
以下のコードを見てください。
コンソール ウィンドウには次のように表示されます。
これは私には意味がありません。多くの人をループに陥れると思います。変数 vehicle を VehicleBase 型として宣言すると、次のようになります。
メソッド Accelerate は非仮想であるため、これは前のケースでも予想されることです。
前の出力では、(セダンとして型指定された変数 vehicle を使用して、VehicleBase.Accelerate の代わりに Sedan.Accelerate が呼び出されることを期待します。現在のところ、どこから呼び出すかによって異なります (クラス内から、または外部から)行動が変化しています。
再導入されたメソッドのオーバーロード解決規則が優先されているように思えますが、これが正しい/予期される動作であるとは信じがたいです。
c++ - 可変個引数リストと単一テンプレートパラメータ:標準は何と言っていますか?
次のコードを検討してください。
「single」とマークされた行が(g ++ 4.6.3で)うまくコンパイルされ、オーバーロード解決の問題が発生しない理由がわかりません。c ++ 11標準では、パラメーターの数が固定されたテンプレート関数が、同じ署名を持つ可能性のある可変個引数関数よりも優先されるとされていますか?
c++ - 基になる固定型の char を持つ列挙型の値が、fct(char) ではなく fct(int) に解決されるのはなぜですか?
この問題は、 enums を使用したオーバーロードの解決に関するこの質問に答えるときに発生しました。
long long
原因は間違いなく MSVC2012NovCTP のバグでしたが (標準テキストと gcc 4.7.1 でのテストによると)、次の動作が発生する理由がわかりません。
MSVC2012NovCTP と gcc 4.7.1 の両方がこの出力に同意します。
fct(文字)
fct(int)
からにA
変換すべきではありませんか? に変換されるのはなぜですか?charEnum
char
A
int
編集: clang は、呼び出しがあいまいであると不平を言います。これは、以下の私の解釈に同意します。とはいえ、それが基礎となる型であるとのみ考えられていれば、私はそれをはるかに直感的に見つけることができます.
関連する 2 つの標準の抜粋は §7.2/9 です。
列挙子の値またはスコープのない列挙型のオブジェクトは、整数昇格によって整数に変換されます (4.5)
そして§4.5/4:
基になる型が固定されている (7.2) スコープのない列挙型の prvalue は、その基になる型の prvalue に変換できます。さらに、基になる型に整数昇格を適用できる場合、基になる型が固定されている範囲指定されていない列挙型の prvalue も、昇格された基になる型の prvalue に変換できます。
したがってcharEnum
、 に変換するか、などchar
の の任意の整数昇格を行うことができます。char
int
しかし、これは私には漠然としています。なぜなら、「できる」は実際にどちらが選択されるかを正確に示していないからです。どちらかといえば、この表現はあいまいである必要がありますchar
。をコメントアウトするfct(int)
と、呼び出しがあいまいになります。なぜint
特別なのですか?
私が考えることができる唯一のことは、統合プロモーションが再帰的に適用されるということですが、それを強制するものは何もありません。
c++ - 2 引数関数のオーバーロード解決が正しくない
次のプログラム例を見てみましょう。
VS 2010では、これは問題なくコンパイルされます (現時点では明らかなリンカー エラーは無視してください)。しかし、VS 2012では次のようになります。
エラー C2440: 'conversion': 'float' から 'half_float::half' に変換できません
したがって、オーバーロードの解決は名前空間からバージョンを選択するのではなくhalf_float
(ADL が達成する必要があります)、std
暗黙的な変換を使用してfloat
. しかし、奇妙なことに、これは通話に対してのみ発生し、atan2
通話に対しては発生しませんsin
。
half
このエラーが実際に最初に発生した大規模なプロジェクトでは、 のような他の 2 引数関数 (または 2 引数を持つ関数) でも発生しますが、1 引数関数では発生しませんfmod
。同様に、より大きなプロジェクトでは、gcc 4.6/4.7およびclang 3.1でもエラーなく正常に動作しますが、この SSCCE バージョンを明示的にテストしていません。
したがって、私の質問は、VS 2012側でのこの誤った動作ですか ( 2012でのみ発生し、2 引数の関数でのみ発生することを考えると)、それともオーバーロード解決ルールのいくつかの微妙な点を監視しましたか (これは実際に少しトリッキーだと思います)?
編集:using namespace half_float
直接または全体をグローバル名前空間に直接配置した場合にも発生します。同様に、私がそうでない場合にも発生しますusing namespace std
が、これは数学関数をグローバル名前空間に配置する VS 実装です。
編集:元のVC 2012コンパイラと2012 年 11 月の CTPの両方で発生します。
編集:厳密な意味で本当に標準に違反しているかどうかは完全にはわかりませんが、少なくとも 1-引数は機能し、VSチームによるさらなる調査に値します。
c# - オーバーロードのセットから最適なオーバーロードを取得する
次のようなクラスがあるとしましょう。
これをコードで使用しようとすると、次のようなものを使用します。
7 である理由は、オーバーロードの解決が [ IList<object>
]IEnumerable<object>
と [ ] よりも [ ] を優先し、 object
[ string
, ] が [ ] よりも優先されるためです。int=default
object
私のシナリオでは、リフレクションを使用して最適なオーバーロードを取得したいと考えています。つまり、「最高」は「c# オーバーロード解決」として定義されます。例えば:
私がスケッチしたシナリオにはパラメーターが 1 つしかありませんが、私が求めるソリューションには複数のパラメーターが含まれる場合があります。
更新 1 :
過負荷解決の実装の難しさから SO には難しすぎるというコメントをいただいたので (私も十分承知しています)、アップデートを送信したいと思います。私の主張に力を与えるために、これが私の最初の試みでした。これは、オーバーロードの解決を処理するデフォルトの .NET バインダーを使用します。
このバージョンは、すでに単純なオーバーロードの解決を正しく行っているようですが、オプションのパラメーターでは機能しません。ここで示したように、.NET は型バインディングで機能するので、このソリューションはかなり簡単に実装できると思います。
c++ - c ++ 11 std::moveおよびcopyandswapidiomを使用した'operator='のあいまいなオーバーロード
次のエラーが発生します。
次のコードをコンパイルする場合:
でコンパイルした場合g++ -std=c++11 main.cpp && ./a.out
:
この場合、コピーとスワップのイディオムを使用すると、あいまいさが発生する理由を誰かが理解するのを手伝ってもらえますか?
c# - 演算子を適用するときの過負荷の解決| 異なるタイプの列挙型
最近の質問を読んだ後、異なる列挙型間の操作は別の列挙型宣言で許可されていますが、他の場所では許可されていません。この例を思いつきました。
コンパイルの結果:Gamma
コンパイルされません(CS0266:タイプ'ulong'を'long'に暗黙的に変換できません。明示的な変換が存在します(キャストがありませんか?))。Delta
楽しくコンパイルします。
これは、C#言語仕様から予期されないことではありませんか?
(注:Alpha
初期化するメンバーをのように負の定数に変更すると、コンパイルもコンパイルもされ-1L
ません。)Gamma
Delta
c++ - 関数を仮想としてマークすると、unique_ptr でコンパイラ エラーが発生する
ベクターをラップするテンプレート化されたクラスがあります。このクラスに unique_ptrs を格納しようとしていますが、正常に動作します。ただし、void add(const T& elem)
関数を仮想としてマークすると、コンパイラ (clang) は、unique_ptr に対して「暗黙的に削除されたコピー コンストラクターへの呼び出し」を行っていることを通知します。
unique_ptrs はコピーできないことを理解しているので、void add(T&& elem)
関数を作成しました。他の追加関数を仮想としてマークするとコンパイラエラーが発生する理由がわかりません。
御時間ありがとうございます。