問題タブ [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++ - テンプレート化された関数名のルックアップの難問 (ADL)
次のコードでは、より具体的な SomeClass ベースの関数ではなく、ジェネリック関数が呼び出されるのはなぜですか?
注: " void foo(const SomeClass<T>*)
" 定義から const を削除すると、目的の関数が呼び出されます。影響はありませんでしたが、fooの再配置も試みました。可能であれば、この特定の ADL シナリオを説明する標準の関連領域を参照してください。
const あり: http://ideone.com/DIchLl
const なし: http://ideone.com/Iam4LV
const あり (1st): http://ideone.com/W6PoJw
c++ - 2つのポインターで呼び出さないのにswap()がうまく機能するのはなぜですか?
上記はテストサンプルです。を使用するswap(array[1], array[4]);
と、配列内の2つの位置の値も交換されます。swap()
しかし、関数には2つの整数値ではなく、2つのポインターが必要なので、これは私を混乱させます。
ご協力いただきありがとうございます:)
c++ - ADLは静的メンバー関数を検索しませんか?
これは、引数依存のルックアップは名前空間またはクラスのみを検索しますか?からのフォローアップの質問です。、@DavidRodríguezは「ADLは型の囲んでいる名前空間を調べ、型自体の内部も調べます」と述べています。私は彼が言おうとしたことを間違えたかもしれませんが、私はこの例を試していました:
コンパイルされず、エラー「'bar'はこのスコープで宣言されていません」が生成されます。ADLが静的メンバー関数を考慮しないのは事実ですか?つまり、関連するクラスの例では、foo
ADLはクラスの内部を調べないのでしょうか。。誰かがここでルールを単純化できますか?
c++ - Argument Dependent name Look-up (ADL) はどのような状況で機能しますか?
以下のウィキペディアの記事では、引用が言及されています:
ADL は、非修飾名の通常の検索で一致するクラス メンバー関数が見つからない場合にのみ発生します。この場合、通常のルックアップでは考慮されない他の名前空間 が検索される可能性があります。検索される名前空間のセットは、関数の引数の型によって異なります。
したがって、以下のプログラムが正常にコンパイルされることを期待していましたが、そうではありません。
SO でいくつかの質問を検索しましたが、要件や状況を簡単な言葉で表したものを見つけることができませんでした。
もう少し詳細な回答は、私と将来の訪問者にとって本当に役に立ちます。
apache-flex - Maven /FlexMojos4.2ベータを使用したAIRアプリケーションテストの実行
AIRアプリケーションであるMavenモジュールがあります。FlexMojosプラグイン(バージョン4.2-ベータ版)を使用しています。
編集:さらに調査したところ、問題はテストTestRunner.xml
に使用された記述子にAIR 2.6名前空間があるのに対し、私のadl
バージョンは3.6であることが明らかになりました。したがって、このバージョンまたは記述子全体を制御する方法が必要です。
テスト目標を実行すると、常にこのエラーが発生します。
[ERROR] Failed to execute goal org.sonatype.flexmojos:flexmojos-maven-plugin:4.2-beta:test-run (default-test-run) on project mobile-app: Unexpected return code 9
これが私のビルド構成です(flex.sdk.version=4.5.1.21328
)
を使用mvn test -X
すると、ADLが呼び出されていることがわかります。
[DEBUG] [LAUNCHER] exec: [adl] - /XXX/mobile-app/target/test-classes/TestRunner.xml
私の知る限り、adlのエラーコード9は次のことを意味しますThe main application content file is not a valid SWF or HTML file.
。
私は何が欠けていますか?どんな助けでも大歓迎です!
c++ - 引数に依存するルックアップのあいまいさを回避する目立たない方法
これが私のケースです:
Foo::a
type を持ち、 a も指定するライブラリを使用しようとしてFoo::swap
います。私が使用している別のライブラリにはstd::vector<Foo::a>
インスタンス化があります。Visual Studio 11.0 を使用して Windows でこれをコンパイルしようとしていますが、修飾されていないスワップ呼び出しを行うstd::vector::swap
マップがダウンしていることに気付きました。_Swap_adl
これが、ADL とあいまいな関数の解決に関する問題に私を陥れるものです。Foo::swap
私が消費しているライブラリに「大きな」変更を加えることなく(std::swap
Fooなどからスワップを削除/名前変更するだけのもの)、使用できるようにする魔法はありますか?
編集:何が起こっているのかとエラーをキャプチャする最小限の例を追加します。
コードの効率性についてはコメントしませんが、@ http://pastebin.com/Ztea46aCのエラー ログを参照すると、内部で何が起こっているかがわかります。これはコンパイラ固有の問題ですか、それともこのコードから得られるより深い学習はありますか?
編集2:問題の特定のタイプに特化しようとしましたが、あいまいさは解決しません。これがなぜそうであるかについての指針も同様に役立ちます。
http://pastebin.com/sMGDZQBZは、この試行のエラー ログです。
c++ - テンプレート内の引数依存のルックアップ
テンプレートのコンテキストでの関数名の検索について混乱しています。テンプレートがインスタンス化されるまで、コンパイラはテンプレート化されたコードで引数に依存する識別子の検索を遅らせることを知っています。つまり、テンプレート化されたコード内で構文エラーが発生したり、存在しない関数を呼び出したりすることがありますが、テンプレートを実際にインスタンス化しない限り、コンパイラは文句を言いません。
ただし、さまざまなコンパイラ間に不一致があることがわかりました。標準自体が何を必要としているのかを知りたいと思っています。
次のコードを検討してください。
テンプレート メンバー関数は、まだ宣言されていないという引数に依存しないグローバル関数をFoo::bar
呼び出すことに注意してください。do_something
それでも、GCC 4.6.3 は上記のプログラムを問題なくコンパイルします。実行すると、出力は次のようになります。
そのため、コンパイラはテンプレートがインスタンス化されるまで識別子の検索を遅らせたように見え、その時点でdo_something
.
対照的に、GCC 4.7.2 は上記のプログラムをコンパイルしません。次のエラーが発生します。
したがって、GCC 4.7.2 は が後で宣言されていることを認識していますが、引数に依存しない do_something
ため、プログラムのコンパイルを拒否します。do_something
したがって、ここではおそらく GCC 4.7.2 が正しく、GCC 4.6.3 は正しくないと思います。おそらく、が定義されるdo_something
前に宣言する必要があります。これに関する問題は、自分のクラスのユーザーがの独自のオーバーロードを実装しての動作を拡張Foo::bar
できるようにしたいと考えていることです。次のように書く必要があります。Foo
Foo::bar
do_something
ここでの問題は、 のオーバーロードがdo_something
内から見えないFoo::bar
ため、呼び出されないことです。したがって、 を呼び出しても、 のオーバーロードではなくdo_something(int)
呼び出します。したがって、GCC 4.6.3 と GCC 4.7.2 の両方で、上記のプログラムは次のように出力します。do_something(T)
int
それで、ここでいくつかの解決策は何ですか?Foo::bar
ユーザーが独自のオーバーロードを実装して拡張できるようにするにはどうすればよいdo_something
ですか?
c++ - ADL は名前付きラムダで動作しますか?
1 つの名前空間にクラスと名前付きラムダがあるとします。
このラムダは、インラインで宣言された関数とほぼ同等です。bla
しかし、 ADL (引数依存ルックアップ、Koenig ルックアップとも呼ばれます) を使用して名前空間に言及せずに、別の無関係な名前空間からそのラムダを呼び出すことはできますか?
c++ - B::f はあいまいさを解決しないのに、A::f は解決するのはなぜですか?
B::f はあいまいさを解決しないのに、A::f は解決するのはなぜですか?