問題タブ [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 に答える
145 参照

c++ - C++ テンプレートに関する問題 (大きな驚き!)。なぜこれがうまくいかないのですか?

C# プロパティを模倣する方法をテストしており、次のpropertyクラスを作成しています。

このクラスを次のコードでテストしました。

これにより、行で予期しないコンパイラ エラー " no match for 'operator='..." が発生しますS = std::string(c);S問題がより単純なように見えるため、の印刷をコメントアウトしました。operator=その解決策で問題も解決されることを願ってoperator<<います。何が起こっているのかを把握するために、次のようにテンプレートを手動でインスタンス化しました。

私の手動バージョンは機能します。テンプレートバージョンがそうでない理由を誰か説明できますか? BY_REF(これはandクラスと関係があると思われますBY_VALが、なぜ整数に対して機能するのかわかりません。)

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

delphi - オーバーロードメソッドのアドレス位置の取得

オーバーロードされている関数/プロシージャ/メソッドのすべてのアドレス位置を取得するにはどうすればよいですか?

たとえば、Dialogs.MessageDlgPosHelpは、2つの異なるバージョン(デフォルトボタンなしとデフォルトボタンあり)でオーバーロードされています。2つの関数のアドレス位置を取得するにはどうすればよいですか?

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

c++ - SunStudio12でのテンプレートコンパイルエラー

Sun Studio 12.1に移行し、新しいコンパイラ[CC:Sun C ++ 5.10SunOS_sparc2009/06/03]を使用します。以前のバージョンのSunCompiler[CC:Sun WorkShop 6 update 2 C ++ 5.3 2001/05/15]で正常にコンパイルされたコードをコンパイルしているときに、コンパイルエラーが発生します。

これは私が得るコンパイルエラーです。

"Sample.cc":エラー:main()に必要なLoopThrough(int [2])に一致するものが見つかりませんでした。1エラーが検出されました。***エラーコード1。

コード:

Genericバージョンでコードのコメントを外すと、コードは正常にコンパイルされ、Genericバージョンが呼び出されます。拡張機能が無効になっているMSVC2010でこの問題が発生することはなく、ideoneでも同じ問題が発生します。関数の特殊バージョンが呼び出されます。問題は、これはSunCompilerのバグですか?

はいの場合、どのようにしてバグレポートを提出できますか?

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

c++ - 演算子のオーバーロード解決は名前空間内でどのように機能しますか?

演算子のオーバーロードのC++解決の奇妙な動作を見つけました、私は自分自身を説明することはできません。それを説明するいくつかのリソースへのポインタは、答えと同じくらい素晴らしいでしょう。

私は2つの翻訳ユニットを持っています。1つ(util.cpp / hと呼ばれる)では、2つの演算子を宣言して定義します(読みやすさのために実際の実装を省略します。とにかく問題が発生します)。

と:

これらの演算子は、もちろんグローバル名前空間にある場合、std型と組み込み型で動作し、どこからでも使用できるはずです。これらは、グローバル名前空間(たとえば、main()から)から、またはグローバル名前空間にあることをコンパイラーに明示的に通知することで正常に機能します(コード例を参照)。

別の変換ユニット(test.cpp / hと呼ばれる)では、名前空間内でこれらの演算子を使用します。これは、この名前空間に同様の演算子を配置するまで機能します。この演算子が追加されるとすぐに、コンパイラー(gccやclangなど)は実行可能な演算子>>を見つけることができなくなります。

と:

名前空間に演算子>>がないのに、コンパイラが正しい演算子を検出するのに、存在する場合は検出できないのはなぜですか?署名が異なっていても、演算子が正しいものを見つけるコンパイラの機能に影響を与えるのはなぜですか?

これを修正する1つの試みは、

std :: istream&operator >>(std :: istream&is、const char * str){:: operator >>(is、str); }

名前空間に入れますが、リンカーが以前の定義について文句を言うよりも。だから追加:なぜリンカーはコンパイラーが見つけられないものを見つけることができるのですか?

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

c# - 実行時にメンバー名を解決する

タイプ名前署名が与えられた場合、7.4のC#ルール(7.4はC#言語仕様の章番号)(または少なくとも一部)を使用して、名前と署名署名を持つメンバーのメンバールックアップを実行するにはどうすればよいですか?それらの...実行時に変換/キャストなしで完全に一致して生きることができるとしましょう?MethodInfo/ / ...を取得する必要があります。これは、リフレクションで使用する必要があるためです(より正確には、ビルダー(ステートメントを表す式ツリーを作成できるファクトリ)PropertyInfoを構築しようとしています)。 C#でピクセルパーフェクトダックタイピングを実行して、Expression.ForEachforeachforeachGetEnumerator8.8.4で記述されているように、メソッド(コレクション内)、Currentプロパティ、およびMoveNextメソッド(列挙子内)

問題(問題の例)

明らかに、試してみるtypeof(C3).GetProperty("Current")AmbiguousMatchException例外が発生します。

同様の、しかし異なる問題がインターフェースに存在します:

typeof(I3).GetProperties()ここで、プロパティを取得しようとするとCurrent(これは既知のものです。たとえば、GetProperties()を参照して、インターフェイス継承階層のすべてのプロパティを返します)、インターフェイスを単純にフラット化することはできません。誰が誰を隠しているのかわかりません。

Microsoft.CSharp.RuntimeBinderおそらくこの問題は名前空間のどこかで解決されていることを私は知っています(Microsoft.CSharpアセンブリで宣言されています)。これは、C#ルールを使用しようとしているため、動的メソッド呼び出しがある場合はメンバールックアップが必要ですが、何も見つかりませんでした(そして、取得するのは、Expressionまたはおそらく直接呼び出しになります)。

Microsoft.VisualBasicいくつか考えた後、アセンブリに似たようなものがあることは明らかです。VB.NETは遅延バインディングをサポートしています。にMicrosoft.VisualBasic.CompilerServices.NewLateBindingありますが、レイトバウンドメソッドは公開されていません。

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

c++ - 関数引数の const 修飾子がオーバーロードの解決に使用されるのはなぜですか?

重複の可能性:
const 引数を持つ関数とオーバーロード

オーバーロードと const 宣言の規則にかなり混乱しています。ここに私を困惑させる 2 つの事柄があります。私の頭の中のより深い誤解を見つけるのを手伝ってくれるかもしれません。;)

創刊:

私のコンパイラはこれを許可します:

ただし、次の場合はコンパイル エラーが発生します (関数には既に本体があります)。

const は、渡されたオブジェクトが変更されておらず、2 番目のケースではとにかくコピーされていることをコンパイラに伝えるためだけにあると思っていたので、これは理にかなっていると思います。しかし、それが正しければ、なぜ const を使用して関数をオーバーロードできるのでしょうか?

言い換えれば、コンパイル バージョンを使用して、次のように関数を呼び出すとどうなりますか。

「const f」の代わりに「plain f」と「const f」を 2 回取得することはできますか? どうやら私は const を使用して、参照が変更されないだけでなく、どの関数を呼び出すかをコンパイラに指示しているようです。「プレーン」バージョンを削除すると問題なく動作し、「const」バージョンを 2 回呼び出すため、これはさらに混乱します。

さて、私の実際の質問は何ですか?この動作の背後にあるアイデアが何であるかを知りたいです。そうしないと、記憶するのが非常に難しいからです。

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

c# - メソッドのオーバーロード解決はどのように機能しますか (LINQ Where 拡張メソッド)?

タイプの変数がある場合、名前空間内で利用可能なIQueryable<T>4 つの拡張メソッドがあります。WhereSystm.Linq

(最後の 2 つは からIQueryable<T>継承するためIEnumerable<T>です。)

ObjectQuery<T>( namespaceで)型の変数を使用する場合、利用可能なSystem.Data.Objects5 つのオーバーロードがWhereあります。つまり、上記の 4 つ (ObjectQuery<T>実装IQueryable<T>およびIEnumerable<T>他のインターフェイスの中で) に加えて、このクラスのインスタンス メソッドがあります。

IQueryable<T>どちらかを使用しているときに同じプログラミングの間違いを犯した場合、またはObjectQuery<T>非常に異なるコンパイラ エラーが発生します。サンプル プログラムを次に示します (VS2010 SP1 の標準 C# コンソール アプリケーション テンプレート +System.Data.Entity.dllプロジェクト参照に追加されたアセンブリ、4 つの例の下のコメントにコンパイラ エラーがあります)。

コンパイラでは、「波線」も異なって見えます。

ここに画像の説明を入力

最初の 2 つのエラーは理解しています。しかし、なぜコンパイラはFunc<T, int, bool> predicate、最後の 2 つの例でオーバーロード番号 4 (を使用) を使用したいのか、「Name」がクラスTestで定義されておらず、「bla」と「blabla」が存在しないことを教えてくれないのはなぜですか。現在の文脈では?

私は、コンパイラがオーバーロード番号 5 (as パラメーターを渡さない) とオーバーロード番号 2 と 4 ( 2 つのパラメーターstringを持つラムダ式を渡さない) を安全に除外できると予想していましたが、私の期待はそうではありません。正しいようです。(t,i) => ...

補足として、この質問を見たときにこの問題に遭遇しました。質問者は、質問の 4 番目のクエリがコンパイルされない (上記の例 3 と 4 のコンパイラ エラーとまったく同じ) と言いましたが、このクエリはまさに彼の問題の解決策であり、私には何か (変数またはプロパティ名?) がクエリに間違って記述されています (ただし、彼はこれを確認していません) が、このコンパイラ エラーは、何が間違っているかを示すのに役立ちません。

編集

以下のMartin Harrisの非常に役立つコメントを参照してください。

query4では、「Delegate System.Func does not take 1 argument」というエラーは、波線の上にカーソルを置いたときにツールヒント ウィンドウに表示されるエラーです。コンパイラの出力ウィンドウには、実際には次の順序で 4 つのエラーが表示されます。

  • デリゲート System.Func は引数を 1 つ取りません
  • 「文字列」はデリゲート型ではないため、「ラムダ式」を「文字列」に変換できません
  • 名前「bla」は現在のコンテキストには存在しません
  • 名前「blabla」は現在のコンテキストには存在しません

しかし、コンパイラが を使用する最初の 2 つの例で最初のエラーを出さないのはなぜIQueryable<T>でしょうか?

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

c++ - これらのオーバーロードされた関数呼び出しがあいまいなのはなぜですか?

次のオーバーロードされた関数呼び出しがあいまいなのはなぜですか?? コンパイルエラーで:

オーバーロードされた 'test(long int)' の呼び出しがあいまいです。候補は次のとおりです: void test(A)| ボイドテスト(B)|

コード:

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

c# - リターンタイプと過負荷の解決が不明確なラムダ変換

のようなラムダがある場合() => { throw new Exception(); }、それがリターンタイプであるかどうかは不明です。Actionこのため、(暗黙的に)とFunc<object>(またはその他)の両方に変換できますFunc<T>。これは、§6.5C #4仕様の無名関数変換によると次の理由によるものです。

[A]デリゲート型は、提供さDれる無名関数と互換性があります。F

  • …</p>

  • がreturn型で、の本体がDステートメントブロックの場合、[…]の本体が有効なステートメントブロックであり、returnステートメントが式を指定していません。voidFF

  • D非voidの戻り型を持ち、の本体がFステートメントブロックである場合、[…]の本体がF到達不能なエンドポイントを持つ有効なステートメントブロックであり、各returnステートメントが暗黙的に戻り値に変換可能な式を指定します。のタイプD

しかし、メソッドのオーバーロードが2つあり、一方がタイプのパラメーターを持ちAction、もう一方Func<object>が上からラムダを渡す場合、Func<object>オーバーロードが使用されます。なんで?仕様のどの部分がこの場合Func<object>よりも優れていると言っていますか?Action

私は§7.5.3.2より良い関数メンバーを見てきましたが、それはそれを説明していません。

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

c++ - GCC と clang のオーバーロード解決動作の違い (SFINAE)

GCC は次のコードを受け入れます。

しかし、clang は次のエラーで拒否します。

これは、過負荷の解決中に GCC と clang が特定の操作を実行する順序の違いを示唆しているようです。テンプレート候補の戻り値の型をインスタンス化しようとする前にS、GCC は 2 番目のパラメーター ( vs. int)の型の不一致のためにテンプレート候補を破棄するようですが、clang はその逆を行うようです。

誰が正しいですか?

この質問は、テンプレート ライブラリの作成者にとって重要な意味を持つと思います。具体的には、clang が正しい場合、テンプレートの作成者はfoo、エラーを置換の失敗に変えるために追加の作業を行う必要があります。

EDIT : 次のやや単純な例は、GCC と clang の両方で拒否され、同様のエラーが発生することに注意してください。

GCCは、「関数型とそのテンプレートパラメータ型の直接のコンテキストで無効な型と式のみが推論の失敗を引き起こす可能性がある」ことを知っていることを示唆しています. この例と元の例の違いは、元の例に 2 番目の関数パラメーターが存在することです。これに基づいて、GCC は戻り値の型で置換を実行しようとする前にテンプレート候補を破棄します。問題は、GCCがその順序で物事を行うのが正しいかどうか、または引数の型の一致を考慮する前に戻り値の型で置換を実行しようとする必要があるかどうかだと思います。

更新: Luc Danton の回答により、clang がコードを拒否するのは正しいと確信しました。それに応じて、GCC バグを提出しました