問題タブ [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.

0 投票する
4 に答える
7177 参照

c++ - リテラル0とポインターを使用したオーバーロードされた関数の呼び出しのあいまいさを解決する方法

私はこれがすでにここにあったに違いないと確信していますが、この種の問題を解決する方法についての情報はあまり見つかりませんでした(電話をかけずに):

2つのオーバーロードが与えられた場合、リテラル0の関数を使用した呼び出しは、常にunsignedintバージョンを呼び出す必要があります。

これが発生する理由は理解できますが、func(0u)やfunc(static_cast(0))を常に記述したくはありません。だから私の質問は:

1)これを一般的に行うための推奨される方法はありますか?

2)次のように行うことに問題はありますか?これが機能する理由は何ですか?

0 投票する
2 に答える
710 参照

c++ - 非constrefが選択されたコピーコンストラクターを持つパラメータータイプの関数?

is_callable<F, Args...>少し前に、トレイトを書きたいときに、いくつかのコードの次の動作に混乱しました。過負荷の解決では、非定数refによる引数を受け入れる関数は呼び出されませんよね?コンストラクターが必要なため、次のように拒否しないのはなぜTest&ですか?かかると思っていましたf(int)

エラーメッセージは

一方が機能するのにもう一方が機能しない理由を説明していただけますか?

0 投票する
2 に答える
533 参照

c++ - 役に立たない(おそらく間違っていますか?)gccエラーメッセージ

コンパイラのエラーメッセージがもっと役に立ったらすぐに修正できたはずのコンパイラエラーのデバッグに数時間を費やしました。

私はそれを簡単な例に減らしました:

エラーは次のとおりです。

このエラーは、よくても誤解を招くものではなく、最悪の場合、完全に間違っているのでしょうか。私の見方では、問題は、与えられたgの定義が呼び出しに一致しないということではなく、定義が不正であるということです(decltypeの式f(x)では、指定せずにfを呼び出そうとするため) fのテンプレートパラメータ)。

はるかに合理的なエラーメッセージは次のようなものではないでしょうか。

またはさらに良い:

私はそのような何かを期待していたでしょう...

0 投票する
2 に答える
373 参照

c++ - テンプレート関数のオーバーロードが期待どおりに呼び出されない

私の状況は次のとおりです。

ポインターやnew. これは基本的に次のようになります。

比較演算子を使用すると、null_t実際に値を取得する前にダミーが null に設定されているかどうかを確認したり、その値を必要として自動変換を行う関数に渡したりすることができます。

このクラスは、問題に遭遇するまで、かなり長い間役に立ちました。すべてファイル (この場合は XML) に出力されるいくつかの構造体を含むデータ クラスがあります。

だから私はこれらのような機能を持っています

それぞれが適切なデータで XML-DOM を埋めます。これも正しく動作します。

ただし、現在、これらの構造体の一部はオプションであり、コードでは として宣言されます。

このケースを処理するために、テンプレートのオーバーロードを作成しました。

私の単体テストでは、期待どおり、値または構造がnullable<T>.

ただし、前述のデータ クラス (独自の DLL でエクスポートされる) を使用すると、何らかの理由で最後のテンプレート関数を初めて呼び出す必要があり、代わりに からnullable<T>それぞれの型への自動変換Tが行われ、関数を完全にバイパスします。このケースを処理します。上で述べたように、すべての単体テストは 100% うまくいき、テストとコードを呼び出す実行可能ファイルの両方がデバッグ モードで MSVC 2005 によってビルドされています。

更新:明確にするために-オーバーロードされたAdd関数はエクスポートされず、DLL 内で内部的にのみ使用されます。つまり、この問題が発生する外部プログラムには、テンプレートのオーバーロードされた関数を含むヘッドさえ含まれていません。

0 投票する
2 に答える
1548 参照

c# - ジェネリックと IEnumerable に関するメソッド オーバーロードの解決

先日これに気づきました。たとえば、2 つのオーバーロードされたメソッドがあるとします。

このコード:

プリント:

これらの場合、なぜ彼らはよりもPerson[]よくList<Person>一致しているのですか?TIEnumerable<T>

ありがとう、

更新: また、別の過負荷がある場合

Print(persons.ToList());List Tの代わりに実際に印刷されSingle Tます。

0 投票する
2 に答える
5103 参照

c# - メソッドのオーバーロード解決システムは、null 値が渡されたときに呼び出すメソッドをどのように決定しますか?

たとえば、次のようなタイプがあります。

ここでは、コンストラクターを使用した例を示しただけですが、型自体の非コンストラクター メソッドの場合、結果は同じになりますよね?

だからあなたがするとき:

どのコンストラクターが呼び出され、その理由は?

私はこれを自分でテストすることができましたが、過負荷解決システムがどのように機能するかを理解したいと思っています (それが呼ばれているかどうかはわかりません)。

0 投票する
2 に答える
2578 参照

c# - オーバーロードされたメソッドグループ引数はオーバーロードの解決を混乱させますか?

Enumerable.Selectオーバーロードされたメソッドへの次の呼び出し:

あいまいなエラーで失敗します (わかりやすくするために名前空間は削除されています)。

型引数を明示的に指定しないとあいまいさが生じる理由は確かに理解できますが(両方のオーバーロードが適用されます)、その後はわかりません。

method-group 引数がTuple.Create<char>(char). 期待される型Tuple.Createに変換できるオーバーロードがないため、2 番目のオーバーロードは適用しないでください 。コンパイラが によって混乱してFunc<char,int,Tuple<char>>いると推測Tuple.Create<char, int>(char, int)していますが、その戻り値の型が間違っています。2 つのタプルを返すため、関連するFunc型に変換できません。

ところで、次のいずれかがコンパイラを満足させます。

  1. method-group 引数の type-argument の指定: Tuple.Create<char>(おそらく、これは実際には型推論の問題でしょうか?)。
  2. 引数をメソッド グループではなくラムダ式にする: x => Tuple.Create(x). (呼び出しの型推論でうまく機能しSelectます)。

当然のことながら、この方法で の他のオーバーロードを呼び出そうとしてSelectも失敗します。

ここでの正確な問題は何ですか?

0 投票する
3 に答える
1742 参照

c++ - オーバーロードの解決と配列: どの関数を呼び出す必要がありますか?

次のプログラムを検討してください。

どちらfを呼ぶべきですか?なんで?

3 つのコンパイラの最新リリース バージョンでは、この質問に対する答えが一致していません。

  • (1)は、プログラムがg++ 4.5.2を使用してコンパイルされたときに呼び出されます。
  • (2)は、プログラムがVisual C++ 2010 SP1を使用してコンパイルされたときに呼び出されます。
  • (3)は、プログラムがClang 3.0 を使用してコンパイルされたときに呼び出されます (トランク 127530)

異なる C++0x ドラフトでオーバーロードの解決ルールが大幅に変更されましたか? それとも、これらのコンパイラのうちの 2 つが本当に完全に間違っているのでしょうか? 最新の C++0x ドラフトに従って選択する正しいオーバーロードはどれですか?

0 投票する
3 に答える
1473 参照

c# - ジェネリック型によるあいまいな呼び出しエラーの回避

私は双方向の辞書クラスを作成して、どちらの方向でも高速に検索できるようにしています。

私のクラスは(部分的に)次のようになります。

この例では配列インデックス演算子を使用していますが、ほぼすべてのメソッドに 2 つのジェネリック バージョンがあります。A == Bの場合を除いて、うまく機能します。

私が行った場合

あいまいなインデクサーのため、コンパイルさえしません。

コンパイラがこれに問題を抱えている理由を理解しており、おそらく合法ではないことに同意します。

が必要な有効なユースケースが実際にありDoubleDictionary<int,int>、配列インデックスがフォワード ディクショナリにアクセスすることを任意に選択したとします。

これらすべてを回避するために私がたどり着いた解決策は、方向ごとに一意に名前が付けられたメソッドの洗練されたインデックス作成構文を放棄することです。これにより、魔法がはるかに少なくなり、楽しくなくなります。

一意の名前のメソッドに頼ることなく、あいまいさを解決するためのヒントをコンパイラに与える方法はありますか? オーバーロードでこれを行うというアイデアが本当に好きで、そのままにしておきたいと思っています。呼び出し元が心配する必要がないようにクラスでそれを行うことをお勧めしますが、呼び出し元はそれを機能させるために何らかのリフレクション マジックを実行する必要があると思います。

それが不可能な場合は、A を B と同じにすることはできないという制限で問題ありません。宣言がDoubleDictionary<int,int>コンパイルされないように、それを成文化する方法はありますか? コンストラクターで例外をスローすることもできますが、コンパイル時にキャッチされるとよいでしょう。

0 投票する
4 に答える
692 参照

c++ - 宣言の使用に関するC++0xの混乱

この場合はどうなるでしょうか。

関心のある行はです f()。明らかに、FDISfによるによるルックアップは成功し、を見つけます。ただし、過負荷解決ではどの候補が考慮されますか?仕様は次のように述べています:10.2A::f13.3.1p4

using-declarationによって派生クラスに導入された非変換関数の場合、関数は、暗黙のオブジェクトパラメータのタイプを定義する目的で、派生クラスのメンバーであると見なされます。

これの目的は、単一のクラスの場合、そのようなクラスに独自のメンバー関数と、基本クラス関数の名前をスコープに入れるusing宣言の両方が含まれている場合、過負荷解決中にすべての関数候補が暗黙のオブジェクトで同じクラスタイプを持つことです。パラメータ。しかし、これは上記の例にとって何を意味するのでしょうか?候補者は次のようになりますか?

によるルックアップ結果セットには宣言が1つしかないため、これは間違っているように見えます10.2p7。これをどのように解釈しますか?