過負荷機能へのあいまいな呼び出し
-
28-10-2019 - |
質問
2つの機能があります。
void DoSomething( const tchar* apsValue )
void DoSomething( size_t aiValue )
今、私はsize_tとして「0」を渡したいです:
DoSomething(0);
コンパイラはエラーをスローします:「過負荷機能への曖昧な呼び出し」
これを解決するために、たとえばstatic_castを使用できます。
DoSomething(static_cast<size_t>(0));
またはシンプル:
DoSomething(size_t(0));
それらの1つは他のものよりも優れていますか?これを解決するための他のアプローチはありますか?
解決
それはあいまいだからです 0
タイプがあります int
, 、 いいえ size_t
. 。どちらに変換できます size_t
またはポインターなので、両方の過負荷がある場合、それはあいまいです。一般に、関数が過負荷になり、そのうちの1つが積分タイプを取得できる場合は、の過負荷を追加することをお勧めします。 int
, 、多分:の線に沿って:
inline void DoSomething( int aiValue )
{
DoSomething( static_cast<size_t>( aiValue ) );
}
積分リテラルにはタイプがあります int
デフォルトで(それらが大きすぎてフィットしない限り int
)、そして正確な一致を提供することにより、あいまいさを避けます。
他のヒント
#include <iostream>
#include <stddef.h>
using namespace std;
void DoSomething( char const* apsValue ) { cout << "ptr" << endl; }
void DoSomething( size_t aiValue ) { cout << "int" << endl;}
template< class Type > Type runtime_value( Type v ) { return v; }
int null() { return 0; }
template< class Type > Type* nullPointerValue() { return 0; }
int main()
{
// Calling the integer argument overload:
int dummy = 0;
DoSomething( size_t() );
DoSomething( runtime_value( 0 ) );
DoSomething( null( ) );
DoSomething( dummy );
static_cast< void(*)( size_t ) >( DoSomething )( 0 );
// Calling the pointer argument overload:
DoSomething( nullptr );
DoSomething( nullPointerValue<char>() );
static_cast< void(*)( char const* ) >( DoSomething )( 0 );
}
これが機能するのは驚くべきことに思えるかもしれませんが、職場での暗黙の変換だけではありません。それもaです 時定数をコンパイルします 積分型の0は、暗黙的にnullpointerに変換します。例、 null()
結果がコンパイル時定数ではないため、関数はそれを回避します。
あいまいさの理由: NULL
数値があります 0
.
必要な場合は void DoSomething( const tchar* apsValue )
通り過ぎるとき 0
パラメーターとして、 nullptr
役に立ちます。これをチェックして nullptrとは正確には何ですか?
所属していません StackOverflow