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

c++ - クラスの const バージョンではなく非 const バージョンが選択されるのはなぜですか?

以下はテストコードです。

今、呼び出すと:

常に非 const バージョンを選択するのはなぜですか? 作成operator const int () const;しても、呼び出しには影響しませんfoo()。標準的な参考文献とは別に、誰かがその背後にある理由を論理的に説明できますか?

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

c++ - この過負荷解決の頭痛の原因は何ですか?

いくつかの場所で繰り返されるネストされたif/switchステートメントがたくさんあるプログラムがあります。私はそれを抽出してスイッチをテンプレートメソッドクラスに入れ、クライアントがオーバーロードを使用して具体的に処理したいスイッチブランチをオーバーロードできるようにしました。

ただし、これはコンパイルに失敗し(少なくともClientMergeFooTwoの場合)、Foo&をSpecificFoo&に変換できないと言います。で完全に優れた一般的なオーバーロードを選択する代わりに、その変換が失敗する理由はありMergeFooますか?

編集:まあ、この擬似コードの例は、私がそれを書き込もうとした速さを考えると、明らかにうまくいきませんでした。私はいくつかの間違いを訂正しました...

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

c# - オーバーロードされたメソッドでの StackOverflowException

次のようなコードでオーバーロードされたメソッドを呼び出そうとしています:

すべて問題ないように見えますが、StackOverflowException がスローされます。私の理解では、オーバーロードされたメソッドを呼び出す場合、最も具体的なメソッド バージョンを呼び出す必要がありますが、この場合は のMethod(BaseClass<ChildClass> other)代わりに が呼び出されMethod(ChildClass other)ます。

しかし、キャストを使用する場合:

すべてが期待どおりに機能します。私は何かが欠けていますか?または、これは .NET のバグですか? .NET 2.0、3.5、4.0 でテスト済み

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

c++ - C++オーバーロード演算子の解決

私はC++を学び、C++Primerを使用しています。次の演習14.46を検討してください。

上記のプログラムのgcc4.5を使用してコンパイルすると、次のようになります。

(3)が選択されていないのはなぜですか?完全に一致していませんか?

ただし、(3)のパラメータの定数を削除すると、完全に一致することに気付きました。

(4)を使用すると、あいまいさはありません。ここで何かが足りませんか?

0 投票する
5 に答える
2859 参照

c++ - クラス メンバー関数の間違ったオーバーロードを選択する C++ コンパイラ

私はこのコードを持っています:

ただし、コンパイラはOther::some_function()inの間違ったオーバーロードwtf_func()(つまり、非 const のもの) を選択します。どうすればこれを修正できますか? の名前を変更できない理由があることに注意してくださいOther::some_function()

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

c++ - スーパークラスによるオーバーロードされたコンストラクターのあいまいな呼び出し (値渡し)

私は GSL のいくつかの部分に小さな C++ ラッパーを書き、次のパズルに遭遇しました (私にとって)。コードは次のとおりです (要点のみに縮小)。

gcc 4.4.5 g++ -c v.cpp を使用してコンパイルされませんが、生成されます

保護された基底クラス gsl_vector_view が useVector( Vector ) の呼び出しで考慮されていることに驚きました。useVector は、「The C++ Programming Language」、3rd e.、p. 405 であるため、その保護された情報にアクセスできないため、混乱することはありません。コンストラクターを次のように宣言することで、あいまいさを取り除くことができることを知っています

私が知らなかった (正直なところ、どちらも理解していない) ことは、コンストラクターを次のように宣言すると、オーバーロードされた呼び出しのあいまいさがなくなることです。

つまり、参照によって引数を渡します(とにかく、これは適切な方法だと思います)。

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

c# - 動的引数を使用したメソッドのオーバーロードの解決

これは以前に答えられているかもしれません。「動的メソッドのオーバーロードの解決」に関する質問はたくさんありますが、特にdynamic引数の受け渡しに関する質問はありません。次のコードではTest、 への最後の呼び出しMが解決できません (コンパイルされません)。エラーは次のとおりです: [の最初の 2 つのオーバーロード]の間で呼び出しがあいまいMです。

  1. 型が静的に認識されていないため、オーバーロードの受け入れに解決されないのはなぜdynamicですか?
  2. オーバーロードされたメソッドを使用することさえ可能dynamicですか?
  3. これを解決する最善の方法は何ですか?
0 投票する
4 に答える
23556 参照

c++ - 非 const バージョンではなく const 関数を呼び出す

目的のために Qt の共有データ ポインターに似たものをラップしようとしました。

私は C++0x オプションを使用してコンパイルしています。最小限のコードは次のとおりです。

ご覧のとおり、Data.x は const 関数なので、呼び出される演算子 -> は const でなければなりません。そして、非 const をコメントアウトすると、エラーなしでコンパイルされるので、可能です。それでも私の端末は次のように出力します:

「非定数データptr」

それは GCC のバグ (私は 4.5.2 を持っています) ですか、それとも欠けているものがありますか?

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

c++ - C++11 オーバーロード解決の奇妙なケース

今日、オーバーロード解決のかなり奇妙なケースに遭遇しました。私はそれを次のように減らしました:

可変引数の数がゼロで、オブジェクトの初期化子リスト構築として扱われるC c({1, 2})の最初のコンストラクターと一致することを完全に期待していました。C{1, 2}S

ただし、C の削除されたコピー コンストラクターと一致することを示すコンパイラ エラーが表示されます。

私はそれがどのように機能するかを見ることができます.Cの有効な{1, 2}初期化子として解釈できます.可変引数です...しかし、特に問題のコピーコンストラクターが削除されていることを考えると、なぜそれがより良い一致になるのかわかりません。1S2

ここで行われているオーバーロードの解決規則を説明して、コンストラクター呼び出しで S の名前を言及しない回避策があるかどうか教えてください。

編集: 誰かがスニペットが別のコンパイラでコンパイルされると述べたので、GCC 4.6.1 で上記のエラーが発生したことを明確にする必要があります。

EDIT 2:スニペットをさらに単純化して、さらに不穏な失敗を引き起こしました:

エラー:

今回は、GCC 4.5.1 でも同じエラーが発生します (constexpr暗黙的に生成されない s とムーブ コンストラクタを除く)。

これが言語設計者の意図したものであるとは信じがたいです...

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

c# - 奇妙なC#コンパイラの動作(過負荷解決)

次のコードで非常に奇妙なC#コンパイラの動作を見つけました:

最後の行で、assertは次のメッセージで失敗します。

テストが失敗する理由を理解しています。他の場合はとしてp2 = new SqlParameter("@p", 0);解決されます。しかし、なぜこれが起こるのかわかりません。私にはバグのように見えますが、C#コンパイラにそのようなバグがあるとは信じられません。SqlParameter(string, SqlDbType)SqlParameter(string, object)

これには何か理由がありますか?

PS enumパラメーターと0の値(SqlDbTypeはenum)を使用したメソッドのオーバーロードでは、問題があるようです。