ここまで説明した「デフォルト引数」と「関数のオーバーロード」を組み合わせた時に発生する問題について説明します。
まず、デフォルト引数を使った関数を1つ作ります。
<sample program cpp010-01>
#include <iostream> void ShowValue(const int value = 0); int main() { ShowValue(); ShowValue(5); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } |
<実行結果>
value = 0 value = 5 続行するには何かキーを押してください・・・
次に同じ名前で引数を2つ受け取るオーバーロード関数を追加します。
<sample program cpp010-02>
#include <iostream> void ShowValue(const int value = 0); void ShowValue(const int value1, const int value2); int main() { ShowValue(); ShowValue(5); ShowValue(2, 4); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } void ShowValue(const int value1, const int value2) { std::cout << "value1 = " << value1 << std::endl; std::cout << "value2 = " << value2 << std::endl; } |
<実行結果>
value = 0 value = 5 value1 = 2 value2 = 4 続行するには何かキーを押してください・・・
関数ShowValueの呼び出しは、
ShowValue(); ShowValue(5); ShowValue(2, 4); |
この3通りですが、どれも呼び出す関数が判別出来ます。
ShowValue(); |
これは、引数がありませんからデフォルトを使って引数が1つのShowValue関数を呼び出します。
ShowValue(5); |
これは、引数が1つですのでそのまま引数が1つのShowValue関数を呼び出します。
ShowValue(2, 4); |
これは、引数が2つですのでそのまま引数が2つのShowValue関数を呼び出します。
さて、ここで引数が2つのShowValue関数にデフォルトの値を設定してみます。
<sample program cpp010-03>
#include <iostream> void ShowValue(const int value = 0); void ShowValue(const int value1, const int value2 = 0); int main() { ShowValue(); ShowValue(5); ShowValue(2, 4); return 0; } void ShowValue(const int value) { std::cout << "value = " << value << std::endl; } void ShowValue(const int value1, const int value2) { std::cout << "value1 = " << value1 << std::endl; std::cout << "value2 = " << value2 << std::endl; } |
<コンパイル結果>
error C2668: 'ShowValue': オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) note: 'void ShowValue(const int,const int)' の可能性があります note: または 'void ShowValue(const int)' note: 引数リスト '(int)' を一致させようとしているとき
コンパイルエラーになりました。
メッセージを見ると、
void ShowValue(const int,const int) void ShowValue(const int) |
この2つの区別が付かないという事でしょう。
ShowValue(5); |
と書いた時に、引数が1つの関数を呼ぶのか、引数が2つの関数でデフォルトの値を使って呼ぶのか判断出来ません。
このように、「デフォルト引数」と「関数のオーバーロード」を併用する際には気を付けてください。