問題タブ [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 投票する
1 に答える
72 参照

c++ - 過負荷解決の問題

SO には既に C++ のオーバーロードに関する質問が山ほどあると言いたいのですが、それらの質問やフォーラムやニュースグループの他の投稿を 1 時間見ても、まだ困惑しています。

バックグラウンド

名前空間を作成し、それを A と呼びます。ここでは、多数のクラスが同じ方法で < 演算子を実装しています。コードの重複を避けるために、私はこれを書きました:

operator_forwards.h というヘッダー ファイルで、他のいくつかの宣言を行います。次に、次のような行を追加して、正しいクラスの友達にしました。

最後に、次のように、operators.h というファイルに定義を入れます。

すべてを 1 つのヘッダー ファイルに含めます。

問題

問題は、次のように operator< を呼び出すときです。

ex1.start<ex2.startA::operator< は問題なく呼び出しますが、vector::iterator のより特殊化された operator< を検索するのではなく、自分自身を再帰的に呼び出します。エラー C2039: start は vector::iterator のメンバーではありません。

A::operator< が ex1.start に対して正しい operator< を呼び出すことを確認するためのアドバイスはありますか?

注: A::operator< を使用する約 20 のクラスがあるため、各クラスで個別に定義することを避けることができれば、それは素晴らしいことです。

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

c++ - 関数オブジェクトはオーバーロードの解決にどのように影響しますか?

関数オブジェクトは、オーバーロードの解決中に通常の関数とは異なる方法で処理されますか? もしそうなら、どのように?

関数を同等に呼び出し可能な関数オブジェクトに置き換えると、コードの意味が変わる次のケースに遭遇しました。

ここでの出力は「N::bar」です。これまでのところ、N::bar は ADL によって検出されており、N::bar とグローバル バーの両方が完全に一致しており、N::bar はテンプレートではないため優先されています。

しかし、グローバル バーを関数オブジェクトに変更すると、次のようになります。

出力は「グローバル バー」になりました。違いはなぜですか?

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

c# - オーバーロード解決の奇妙さ

これが C# 4+ 固有のものかどうかはわかりませんが、これに気付きました。

次のクラスを検討してください。

Fooinへの呼び出しはBarに解決されFoo(object, object)ます。

それを次のように変更しながら:

Fooinへの呼び出しはBarに解決されFoo(object, DayOfWeek)ます。

私の理解では、2 番目の例のように常に解決する必要があります。

これは「バグ」ですか、それとも私の理解不足 (または無知) ですか?

アップデート:

答えてくれてありがとう。私が見つけたようbase.に、基本クラスでメソッドを呼び出すために使用できます。ただし、ミックスに別の派生クラスを追加すると、問題が再発します。

base.呼び出しは で機能しますがProgram、 に解決さFoo(object, object)Derivedます。

で「冗長な」メソッドを作成することなくFoo(object,DayOfWeek)、それからどのように呼び出すでしょうか?DerivedProgram

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

c# - クラス定義でオーバーロードの設定を強制しますか?

私はジェネリッククラスを持っています。2 つのコンストラクターがあります。これらは私の組織のコードベースで広く使用されています。

いくつかの機能を追加したいが、下位互換性を維持したい。そこで、各コンストラクターに新しいブール値のオプション パラメーターを導入したいと思います。

ただし、 T がブール値であり、デフォルト値が渡される使用法がすでに山ほどあります。

現在、オーバーロード優先の法則に従ってsomeFlag、型付きメソッドは「よく知っている」ため、コンパイラはそのようなコンストラクターの使用をすべてオーバーロードを受け入れるオーバーロードに結び付けています。ほとんどの場合、これは完全に理にかなっていますが、これは明らかに私の下位互換性を壊しています。

私の質問は簡単です:オーバーロード設定のデフォルトの法則をオーバーライドし、古いジェネリック オーバーロードを優先するものとして定義する言語機能はありますか?

もちろん、この設計の欠点は、(パラメーターのみで) 最初のオーバーロードを呼び出したいときはいつでも、someFlagC# 4 仕様に従って名前付きパラメーターを指定する必要があることです。

他のデザインの提案も大歓迎ですが、まず私の質問に答えてみてください :)。

0 投票する
1 に答える
274 参照

c# - プログラムでジェネリックを使用してオーバーロード解決を実行する方法

MethodBaseさまざまなオープン ジェネリック メソッド ( ) を参照する多くのインスタンスがありますexpected。たとえば、次のメソッドを表します。

MethodBaseそして、実際に呼び出されたクローズドメソッドを参照する単一のインスタンス ( actual) があります。

特にすべてのジェネリックの落とし穴と複雑さを考慮する場合、actualクローズドメソッドが特定のオープンメソッドのいずれかと一致するかどうかをプログラムで確認するにはどうすればよいですか?expected

具体的には、特定のクローズドメソッドexpectedのリストからの正しいアイテムが2番目のものではないことを特定したいと思います。actualT Foo<T>(string nevermind, T other);

また、MethodBase一致する double Foo<double>(double something, string other)結果がないようにしたいと思います。

候補メソッドを反復処理し、各パラメーターexpectedが対応するパラメーターから割り当て可能かどうかを確認actualするのは良い方法ですか? もしそうなら、それは最も簡単な方法ですか?.NET のメソッド オーバーロード解決規則に従って選択されないメソッドに一致しない特別なケースを考慮する必要がありますか?

0 投票する
1 に答える
203 参照

c++ - 一見あいまいなテンプレート関数のオーバーロード

これに遭遇したときに私が解決しようとした元の問題は、parse_implバージョンを選択することでした:

  • (タイプの)パーサーがUという名前のフィールドを提供する場合は"skp"、そのフィールドを使用します。
  • そうでない場合は、デフォルト値を使用します。

私は次のコードを思いついた:

通話サイトは次のようになります。

これは、あるタイプとないタイプの両方で呼び出されますskp

そしてそれは(gcc4.7で)コンパイルされますが、理由はわかりません。skpが存在する場合、両方enable_ifの式がtrueと評価され(skipper_type明らかにunused_typethenと等しくない)、呼び出しがあいまいになるはずです。どこが間違っているの?

0 投票する
1 に答える
131 参照

c# - ユーザー定義の演算子で裸の null リテラルを使用する場合の奇妙なオーバーロードの解決

TimeSpan(タイトルの「ユーザー定義」とは、 と の加算と減算が C# 標準の一部ではないという事実を指しDateTimeます。それらは BCL で定義されています。)

nullableTimeSpanDateTime値の持ち上げられた演算子をいじって、次のコードを書きました。フレームワークは と で異なる操作を提供することに注意してTimeSpanくださいDateTime

TimeSpan2 つを取り、 sum を返す、1 つの対称 (および可換) 加算がありますTimeSpan。この加算の「逆」は、TimeSpanを生成する2 の減算ですTimeSpan

次に、別の種類の加算、非対称があります。ここでは、1 つDateTime(左オペランド) と 1 つTimeSpan(右オペランド) を使用して を生成しDateTimeます。この演算は非対称であるため、2 つの「種類」の逆行列があります。1 つDateTimeは互いに 2 を減算してTimeSpan差を求めるもの、もう 1 つは 1 を取り、そこから 1DateTimeを減算してTimeSpan結果を生成するものDateTimeです。

自然にいくつかの疑問が生じます。

o許可されているのにint?(ちなみに a ではないのはなぜlong?ですか?) whilegが許可されていないのは少し奇妙です。これは仕様でしょうか?あと、文字列連結で「ありえない」cが解消されるのもちょっと不思議。どうやらコンパイラはnullinc(string)null. 一方、明示的な型の式objectを aに追加すると、コンパイルされません。DateTime

しかし、私の主な質問は、コンパイラandのオーバーロードを選択できるのはなぜですか?dlm

0 投票する
1 に答える
46 参照

c++ - 非ビルトインのテンプレート、ビルトインのオーバーロード

関数bar()をサポートするライブラリを提供しています。スカラー値(double、intなど)を渡したときの動作は、スカラー値ではないもの(予想されるすべての場合、ユーザー定義型)を渡した場合の動作とは異なります。だから私はこのようなコードを書きました:

これに関する問題は、main()の2行目にあります。このコードの結果は「T」の出力です。コンパイラーはbar(double)の呼び出しよりもテンプレートを優先します。これは、パラメーターがintであり、int const&にキャストするためであると想定しています(const&はr値を参照できるため)。

私の質問は、「明示的に呼び出すことなく、すべてのスカラー値をサポートできる方法はありますか?」です。私は本当にすべての可能なタイプを呼びたくありません、なぜなら...まあ...それらはたくさんあるからです。charからlonglongまですべてをカバーし、揮発性とunsignedのすべての組み合わせを含める必要があります。

4を4.0に変更するだけで機能することは知っていますが、これはライブラリへのパブリックインターフェイス用であり、ユーザーが4.0代わりに入力する必要があるの4は汚いだけです。

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

c++ - コンパイラは、選択したオーバーロード関数またはテンプレート関数を教えてくれますか?

特に Linux で g++ を使用する場合、特定のステートメントに対してどのオーバーロード関数またはテンプレート関数が選択されたかを判断する方法はありますか?

より具体的には、さまざまなライブラリからのヘッダー ファイルにある可能性があるすべての可能な選択肢を知っているとは限りません。たとえ変更したとしても、関連するコードを変更できるとは思いません。