問題タブ [argument-dependent-lookup]
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++ - 左シフト演算子のオーバーロード
私が調査したところ、cout の出力ストリーム演算子をオーバーロードしたい場合、正しい方法は次のようにすることであることがわかりました。
ここで起こっていることは、operator<< が実際には ostream で定義されたフレンド関数であり、それを利用しているためです。しかし、問題は、この関数が ostream でどのように定義されているかということです。この関数は 2 つのパラメーターを取り、2 番目のパラメーターはユーザー定義であるため、そこに何が来るかを推測する方法はありません。
クラス固有のオーバーロードは次のようになります。
特にC++にはジェネリッククラス(Javaのオブジェクトなど)がないため、コンパイラ/ライブラリは2番目のパラメーターのジェネリック定義をどのように取得しますか?
c++ - ADL はいつ適用されますか?
3 つの例があります。
私。
Ⅱ.
III.
ADL ルックアップが適用される実際の条件は何ですか? 記載されている標準を参照する必要があります。
c# - 引数依存のルックアップで混乱していますか?
hereから次の例を取り上げました。
C ++で拡張関数を見つけようとしているときに、このようなものに出くわしました。
上記の例は、最初の引数を任意のクラスのオブジェクトとして関数を呼び出し、その関数が現在の名前空間で見つからない場合、コンパイラは最初のオブジェクトの名前空間で必要な関数を見つけることを意味しますか?
私が間違っていれば、この質問は無関係のように思えますが、C# の拡張メソッドはADL と関係がありますか?
c++ - グローバルスコープでstdコンテナの演算子をオーバーロードするのは悪いスタイルですか?
この問題が発生しました:
問題 (ここで説明されているように) は、hides がa += b;
原因でコンパイルに失敗することです。この場合、 ADL は検索のみを行うため、ADL は検索しません。Bar::operator+=(Qux&, Qux const &)
::operator+=
::operator+
namespace std;
B.h
が含まれている場合にのみ問題が発生するため、これはやっかいB.h
ですBuffer
。別のヘッダーを含めるかどうかに応じて、コードが壊れることはありません。
(実際には、コンパイラを変更したときにのみこれを発見しました。使用していた以前のコンパイラは、名前の検索を誤って実行し、コードを受け入れました)。
私の質問は:A.h
この問題のために過負荷は悪い考えですか?
内部でB.h
行うことで今のところ問題を回避していますが、これはかなりハックなようです。より良いオプションはありますか?using ::operator+=;
namespace Bar
c++ - コンパイラが ADL で基本クラス メソッドを見つけられない
ここで何が起こっているのか -- なぜこれはコンパイルされないのですか?
(MinGW と VC11 の両方で、 と同等のエラーが発生しNo conversion from double to std::string
ます。)
で印刷関数の名前を変更すると、Derived
正常にコンパイルされるため、明らかに何らかの方法Derived::print(string const &)
でマスキングされています。Base::print(double)
しかし、関数のシグネチャには引数の型が含まれているので、このマスキングはここで行う必要があるという印象を受けました。基本クラスのメソッドの場合、それは正しくありませんか?