1

私は、次のようなメソッドを保持する広く使用されているc++ライブラリを持っています。

foo();

この関数をオーバーロードして、次のようなデフォルトの引数を設定したいと思います。

foo(bool verbose=false);

この変更により、この関数を使用するすべてのコードを再コンパイルする必要がありますか?foo()no-args-signatureが変更されなかったため、引数なしでの呼び出しは機能し続けることができませんか?

ちなみに-私はgccを使用しています

ありがとう

4

2 に答える 2

3

この変更により、この関数を使用するすべてのコードを再コンパイルする必要がありますか?

はい。あいまいさが生じるため、コンパイルは失敗します。

あなたができることは次のように関数をオーバーロードすることです:

foo(bool verbose);

foo()パラメータがfalseであるかのようにケースを扱います。

これは再コンパイルを必要としません。2つの機能があります。

foo() { foo(false); } //possibly
foo(bool verbose);

デフォルトのパラメータを持つものの代わりに。

于 2012-08-28T14:03:24.813 に答える
1

両方が必要な場合は、どちらを意味するかを知る方法がないため、できません。

に置き換えたい場合は、再コンパイル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()が完全にヘッダーにあり、インライン化されていた場合、それは別の問題です。

于 2012-08-28T14:14:29.047 に答える