問題タブ [default-parameters]
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++ - C++ は、既定のパラメーターで「間違った」オーバーロードされたメソッドを選択します
私は次のインターフェースを持っています
これは、次のように呼び出す 1 つのクラスに完全に実装されています。
get が呼び出されたメソッド実装を確認すると、3 番目の呼び出し ( GET foo ) が最終的に最後の実装にヒットすることがわかります。
ここで、「foo」は暗黙的に bool に変換されます。2 番目の実装 (string、string、bool) にヒットする"SET"、"foo"、"bar"についても同じことがカウントされます。
期待されるメソッドが呼び出されます。
C++11 で gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) を使用しています。
.net - オプションのパラメータ: 「空」と「指定なし」
空の値とまったく言及されていない値を区別する方法はありますか?
たとえば、クライアントがプロファイルを更新し、リクエストで指定された値にのみ影響を与えることができるようにしたいと思います...空/nullのものでも。
name="Sherlok" および Birthdate="January 6" のプロファイルが与えられた場合:
これら 2 つの状況で生年月日パラメーターを区別する方法はありますか、それとも魔法の値に頼る必要がありますか?
default-parameters - 複数の句を持つ名前付き関数のElixirデフォルトパラメータ
デフォルトのパラメータが名前付き関数の複数の句とどのように相互作用するか理解できません。要するに、次のスニペットが機能するのはなぜですか?
私の理解では、これはコンパイラによって次のように拡張されます。
したがって、次のことが起こると予想されます。
代わりに動作します:
Elixir 0.12.4を使用しています。
c++ - 派生クラス インスタンスを既定のパラメーター値として使用する
Base
type のデフォルト パラメータ値を持つクラスの静的メソッドが必要ですDerived
。オーバーロードを使用せずにこれを実装する方法はありますか? (ここを参照)。
... incomplete type の使用に関するエラーが表示されますDerived
。ただし、基本クラスの定義の後に定義する必要があるため、の定義をDerived
前に配置することはできません。problem_here
Base
残念ながら、からポインターを返すことmake_derived
はできません。
problem_here
今まで思いついたのはオーバーロードだけですが、「実際の」problem_here
メソッドは2つ(および別の3つ)のパラメーターを取り、それはライブラリの一部であるため、これにより...
.. 2 つのパラメーターの場合のみ。
同じパフォーマンス (パラメーター コンスタレーションの不要なコピー/移動構築がない) と呼び出し元サイトでの同じ動作を維持しながら、これらすべての関数シグネチャを記述することを回避する方法はありますか?
problem_here
のような複数の関数があり、すべての保護されたコンストラクターDerived
(およびその多くの兄弟のコンストラクター) にアクセスする必要があることを追加する必要があります。したがって、これらのメソッドを Base の静的メンバーにする主な理由はfriend class Base;
、すべての関数をフレンドシップするのではなく、各派生クラスでできるようにするためです。
リファクタリングにより、派生クラスの保護されたコンストラクターにアクセスするコードを単一のファクトリー関数に移動できることがわかりました。そうすれば、デフォルトのパラメーターを使用して関数を外部に移動しBase
、ファクトリーを呼び出すことができます。今でも、これらの関数のすべてをフレンドリにする必要がありますが、(Base
ファクトリへのアクセスを許可するために) 1 回だけです。すべての関数をヘルパー クラスに配置し、代わりにそれをフレンドにすることでこれを回避できますが、それは私にはハックのように見えます。
c++ - 名前のない名前空間とデフォルトの関数引数
名前のない名前空間の const メンバー変数を、関数が名前付きの名前空間で宣言されているデフォルトの関数パラメーターとして設定する方法を考えていました。これを説明するのは難しいと思います。ここに私がやりたいことの例を示します。
これはリンクしません...
関数定義にデフォルトのパラメータを書くこともできますが、それは私が望んでいることではありません。これを正しくコーディングするためのアドバイスはありますか?
c++ - std::vector の使用方法> デフォルトのパラメータとして
EDIT2:
明確にするために:
この質問は、実際にはデフォルト パラメーター自体とは何の関係もなく、コピー コンストラクターとムーブ コンストラクターとは何の関係もない問題から生じました。実際に質問に答える回答を受け入れました(質問のタイトルのためにここにいる場合は、それを読んでください)。最初にそれがうまくいかなかった理由を説明します。
なにが問題だったの?
したがって、「編集:」で説明されているように、問題は実際にはかなり単純です。
VisualStudio 2013 での will break コンパイルを含むクラスへの割り当てstd::vector<std::unique_ptr<T>>
(他のバージョンではテストされていません) と、エラー メッセージは非常に不可解です。
コメントの前提は、VC コンパイラにバグがあり、存在しないコピー コンストラクタを呼び出そうとしたことです。
くそ、今何?
この仮定は実際には真実でしたが、私が最初に理解した意味ではそうではありませんでした.
実際、VCCはMyClass
実際には、暗黙的に定義するの移動コンストラクターを呼び出そうとします。しかし、ここに問題があり、正しく定義されていません。
move コンストラクターを明示的に定義する場合、MyClass(MyClass && a)
次のようにコードを記述することで、実際にコンパイラーの動作を模倣できます。
このコードを使用すると、暗黙的な定義を使用した場合とまったく同じエラー メッセージが生成されます。ここで何が問題なのかがすぐにわかると思います。このムーブ コンストラクターは実際に のコピー コンストラクターを呼び出そうとしますがfoos_
、もちろん不可能です。明らかな理由でコピー コンストラクターを持たないstd::unique_ptr
型であるため、その内容に対してコピー コンストラクターを呼び出すことはできません。
代わりにこのコードを使用すると、
std::vector
の移動コンストラクターが呼び出され、そのコンテンツの移動コンストラクターが呼び出されるため、すべてが完全に正常に機能します。
それで、誰のせいですか?
可能性 1:
これは実際にはコンパイラのバグであり、テンプレート解決の問題に起因しています。
コンパイラは、必要に応じてムーブ コンストラクターを暗黙的に定義しようとします。これは、クラス定義にコピーできない型があり、そのクラスへの割り当てがコード内で行われる場合に行います。
これらの 2 つの条件が満たされると、move-constructor の定義に進みますが、テンプレートの実際の型は気にせず、実際にstd::unique_ptrstd::vector
のコピーを定義するクラス自体だけを気にしているようです。constructor, so the VCC tries to use it, which fails because of the missing copy constructor in
または、move-constructor の定義を完全にスキップして、copy-constructor を使用しようとするだけで、同じエラーが発生します。
可能性 2:
Microsoft STL の実装に怪しいものがあります。これは単なる手がかりであり、それがどのように機能したかを正確に説明することはできませんでしたが、それでも私には可能性があるようです.
この混乱を避けるには?
上記のように、独自のムーブ コンストラクターを簡単に定義できます。
編集:
ある特定の問題に行き着くようです。元の回答は以下に掲載されています。
Visual Studio (2013) で、新しい Win32 コンソール アプリケーションを作成し、設定を変更せず、これをメインにします.cpp
。
コンパイルしようとすると、次のエラーが発生します (gcc で確実に動作します!)。
次のようなコンストラクタがあるとします。
この単純なセットアップでは、すべてが正常にコンパイルされます。このコンストラクターのような呼び出しはMyClass(vector<unique_ptr<Foo>>);
成功し、期待どおりに動作します。foos
しかし、デフォルトのパラメーターとして使用したいと思います。
のデフォルト値を達成するにはどうすればよいfoos
ですか?
これは私が思いついたものです:
しかし残念ながら、これはうまくいきません。理由はわかりませんが、誰かがこれに光を当てることができればいいと思います.
次の 2 つの試みは回避策であり、実際のデフォルト パラメータではありません。
どちらも働かないでください。これらのアプローチはどちらも、コンパイラからのエラー メッセージと、最も興味深い部分である長い出力につながります。
c:\users\ username \source\repos\myProject\myProject\MyClass.h(47) : クラス テンプレートのインスタンス化への参照を参照してください
47 は、実際のベクトル定義の行番号ですMyClass
。
だから私の推測では、これは本当に私が初期化で大きな間違いをしているということです。
また、VS2013でコンパイルしています。
エラー全体: