問題タブ [ambiguous-call]
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++ - フレンドとメンバーの二項演算子の曖昧さの解消
二項演算子を使用した次のクラスを考えてみましょう (operator+
例として使用しています)。
この二項演算子は、次の 2 つの異なる型で呼び出すことができます。
次に、A
両面 ( a + a
) で使用しようとすると、多くの奇妙なことが起こります。3 つのコンパイラは、同じコードに対して異なる答えを返します。
void operator+(A const&)
いくつかのコンテキスト:構文が機能しない場合に SFINAE 関数を削除するためのテンプレートが必要なため、定義したくありません。また、私はしたくありませんtemplate<class BB, class AA> friend void operator(BB const&, AA const&)
。sinceA
はテンプレートであるため、インスタンス化が異なると、同じテンプレートの複数の定義が生成されます。
元のコードを続ける:
奇妙なこと # 1: gcc では、フレンドが優先されます。
メンバーが優先されることを期待していますが、メンバーが gcc を優先する方法はありますか?
奇妙なこと # 2: clang では、このコードはコンパイルされません。
これはすでに gcc と clang の間の矛盾を指摘していますが、どちらが正しいですか? gccのように動作させるclangの回避策は何ですか?
引数をより貪欲にしようとする場合、たとえば、いくつかの最適化を適用するために、転送参照を使用できます。
奇妙なこと #3:転送参照を使用すると、gcc で警告が表示されます。
しかし、それでもコンパイルされます.gccまたは回避策でこの警告を消すにはどうすればよいですか? ケース 1 と同様に、メンバー関数を優先すると予想されますが、ここではフレンド関数が優先され、警告が表示されます。
奇妙なこと # 4:転送参照を使用すると、clang でエラーが発生します。
gcc と clang の間の不一致を指摘しているのはどれですか。この場合、どちらが正しいのでしょうか?
要約すると、私はこのコードが一貫して機能するようにしようとしています。私は本当に関数がフレンド関数に注入されることを望んでいます(無料のフレンド関数ではありません)。インスタンス化が異なると同じ関数の宣言が重複して生成されるため、非テンプレート引数が等しい関数を定義したくありません。
再生する完全なコードは次のとおりです。
注: と を使用clang version 6.0.1
してg++ (GCC) 8.1.1 20180712
います。Francis Cugler MSVS 2017 CE によると、さらに異なる動作が得られます。
a+a
clang と gcc (MSVS の場合) の両方で正しいこと (大文字と小文字を区別して「メンバー」を出力) を行う回避策を見つけましたが、ボイラー プレートと人工的な基本クラスには多くのものが必要です。
ただし、に置き換えるBB const&
と、あいまいな呼び出しが行われBB&&
ます。
c++ - std::swap と名前空間のテンプレート化されたスワップとの間で std::sort の名前が競合しないようにするにはどうすればよいですか?
を使用したいのですが、削除するのが難しいテンプレート化された関数が名前空間に定義されているためstd::sort
、コンパイルがエラーで失敗します。どちらを使用するかは気にしませんが、コンパイル時にどちらかをなくすにはどうすればよいですか?C2668: std::swap: ambiguous call to overloaded function
swap()
swap
sort()
my::swap
は と同じ名前空間にあるためあいまいであることは理解しています。どのバージョンのが使用されるmy::Obj
かは気にしません。swap
名前空間の衝突を克服する必要があります。これは私が所有していない非常に大きなコード ベースの一部であるため、私のコードにローカルであり、おそらく名前空間にとどまるmy::Obj
ことができるソリューションを望んでいます。my::swap
my
c++ - あいまいなオーバーロードされた関数は、引数のテンプレート パラメーターのみが異なります
次のコードを検討してください。
「エラー C2668: オーバーロードされた関数へのあいまいな呼び出し」が発生しないように、これをどのように書き直しますか?
注: たとえば、サブクラスも渡してSmartPointer<SubclassOfDataWrapper>
、スーパークラスのオーバーロードされた関数に解決できるようにしたいと考えています。