次の C++ コードを検討してください
class A
{
public:
void doStuff() {};
void callStuff()
{
doStuff(true);
doStuff();
};
private:
void doStuff(bool doIt = false) {};
};
int main()
{
A a;
a.doStuff();
a.callStuff();
return 0;
}
当然のことながら、GCC はこれをコンパイルするときにいくつかのエラーを出します。
overload.cpp: メンバー関数 'void A::callStuff()': overload.cpp:8:10: エラー: オーバーロードされた 'doStuff()' の呼び出しがあいまいです doStuff(); ^ overload.cpp:8:10: 注: 候補は次のとおりです。 overload.cpp:4:12: 注: void A::doStuff() void doStuff() {}; ^ overload.cpp:11:12: 注: void A::doStuff(bool) void doStuff(bool doIt = false) {}; ^ overload.cpp: 関数 'int main()' 内: overload.cpp:17:17: エラー: オーバーロードされた 'doStuff()' の呼び出しがあいまいです a.doStuff(); ^ overload.cpp:17:17: 注: 候補は: overload.cpp:4:12: 注: void A::doStuff() void doStuff() {}; ^ overload.cpp:11:12: 注: void A::doStuff(bool) void doStuff(bool doIt = false) {}; ^
いくつか質問があります:
- どのオーバーロードを使用するかをコンパイラに伝えるにはどうすればよいですか? それらのいずれかを削除する必要がありますか?
- それらのいずれかを削除する必要がある場合、オーバーロードを呼び出さずにコンパイル時にこの問題を見つけるにはどうすればよいですか? それらを呼び出さない限り、すべてが正常にコンパイルされるはずなので、呼び出しようとすると、追加したオーバーロードを呼び出すことができないことが後でわかる場合があります。
- 2 番目のエラーが発生するのはなぜですか? 関数は
main
プライベート オーバーロードにアクセスできないため、使用するオーバーロードを認識している必要があります。