戻り値の型は、関数のオーバーロードの基礎ではありません。
関数のオーバーロードは、次のいずれかの基準でのみ行うことができます。
- 引数の数
- 引数の種類 &
- 引数のシーケンス
戻り値の型は呼び出し元によって無視される可能性があるため、関数のオーバーロードの有効な基準ではありません。
上記のように、値渡しとリファレンスを渡すと、コンパイラにあいまいさが生じます。例:
void doSomething(int i)
{
}
void doSomething(int &i)
{
}
int main()
{
int val = 10;
doSomething(val); //Ambiguous
}
ここで、コンパイラは のどのval
バージョンに渡すかを判断できませんdoSomething()
。どのバージョンに対しても有効な関数呼び出しを行うことができるため、コンパイル時に助けを求めて (これは静的リンクであるため)、呼び出しにあいまいなフラグを立てます。
あなたのような場合。関数の名前を変更するか、2 つの関数をオーバーロードする (同じ名前で引数の型が異なる) ポインター引数を渡すことは、選択/設定です。ただし、設定を選択する際に、要件と関数が実行するアクションを考慮することが重要です。個人的には、オーバーロードのためだけにポインタを選択するつもりはありません。引数を再配置するか、別の変数を指すようにする必要がある場合は、ポインター引数を選択するのが理にかなっています。
簡単な方法は、2 つの異なる関数名を使用することです。オーバーヘッドはなく、他の関数呼び出しと同じくらい効率的です。