質問

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とは正確には何ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top