7

私には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つは他のものより優れていますか?これを解決する他のアプローチはありますか?

4

3 に答える 3

7

ではなく0typeであるため、あいまいです。いずれかまたはポインターに変換できるため、両方のオーバーロードがある場合はあいまいです。一般に、オーバーロードされた関数があり、そのうちの 1 つが整数型を取ることができる場合は、おそらく次の行に沿って のオーバーロードを追加することをお勧めします。intsize_tsize_tint

inline void DoSomething( int aiValue )
{
    DoSomething( static_cast<size_t>( aiValue ) );
}

整数リテラルにはintデフォルトで型があり (大きすぎて に収まらない場合を除きますint)、完全一致を提供することであいまいさを回避できます。

于 2012-02-21T12:35:05.503 に答える
1

あいまいな理由:NULL数値 を持っています0

パラメーターとしてvoid DoSomething( const tchar* apsValue )渡すときに必要な場合は、役に立ちます。これを確認してくださいnullptrとは正確には何ですか?0nullptr

于 2012-02-21T12:44:59.933 に答える
1
#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 );
}

これが機能することに驚くかもしれませんが、暗黙の型変換だけが機能しているわけではありません。また、整数型のコンパイル時定数0 が暗黙的に nullpointer に変換されることもあります。たとえば、null()結果がコンパイル時の定数ではないため、関数はそれを回避します。

于 2012-02-21T12:59:16.990 に答える