私は、次のようなメソッドを保持する広く使用されているc++ライブラリを持っています。
foo();
この関数をオーバーロードして、次のようなデフォルトの引数を設定したいと思います。
foo(bool verbose=false);
この変更により、この関数を使用するすべてのコードを再コンパイルする必要がありますか?foo()
no-args-signatureが変更されなかったため、引数なしでの呼び出しは機能し続けることができませんか?
ちなみに-私はgccを使用しています
ありがとう
私は、次のようなメソッドを保持する広く使用されているc++ライブラリを持っています。
foo();
この関数をオーバーロードして、次のようなデフォルトの引数を設定したいと思います。
foo(bool verbose=false);
この変更により、この関数を使用するすべてのコードを再コンパイルする必要がありますか?foo()
no-args-signatureが変更されなかったため、引数なしでの呼び出しは機能し続けることができませんか?
ちなみに-私はgccを使用しています
ありがとう
この変更により、この関数を使用するすべてのコードを再コンパイルする必要がありますか?
はい。あいまいさが生じるため、コンパイルは失敗します。
あなたができることは次のように関数をオーバーロードすることです:
foo(bool verbose);
foo()
パラメータがfalseであるかのようにケースを扱います。
これは再コンパイルを必要としません。2つの機能があります。
foo() { foo(false); } //possibly
foo(bool verbose);
デフォルトのパラメータを持つものの代わりに。
両方が必要な場合は、どちらを意味するかを知る方法がないため、できません。
に置き換えたい場合は、再コンパイルfoo()
にfoo(bool verbose=false)
なります。呼び出し元のコードは実際には を呼び出していないため、それを隠している構文糖衣でfoo()
呼び出しています。foo(false)
ただし、次のことができます。
someType foo(bool verbose)
{
//real work here.
}
someType foo()
{
return foo(false);
}
または無効の場合:
void foo(bool verbose)
{
//real work here.
}
void foo()
{
foo(false);
}
あなたのアーラーfoo()
が完全にヘッダーにあり、インライン化されていた場合、それは別の問題です。