我有两个功能:
void DoSomething( const tchar* apsValue )
void DoSomething( size_t aiValue )
现在我想传递'0'作为size_t:
DoSomething(0);
编译器抛出一个错误:“对重载函数的模糊调用”
要解决这个问题,我可以使用static_cast,例如:
DoSomething(static_cast<size_t>(0));
或简单:
DoSomething(size_t(0));
其中一个比另一个好吗?有没有其他方法可以解决这个问题?
答案 0 :(得分:6)
这是不明确的,因为0
的类型为int
,而不是size_t
。它可以转换
到size_t
或指针,所以如果你有两个超载,
这是模棱两可的。一般来说,如果你有,我会建议你
你添加了重载函数,其中一个可以采用整数类型
int
的重载,可能是:
inline void DoSomething( int aiValue )
{
DoSomething( static_cast<size_t>( aiValue ) );
}
默认情况下,积分文字的类型为int
(除非它们太大了
适合int
),并通过提供完全匹配,你可以避免任何
歧义。
答案 1 :(得分:1)
含糊不清的原因:NULL
的数值为0
。
如果您在传递void DoSomething( const tchar* apsValue )
作为参数时希望0
,nullptr
会有所帮助。
请检查此What exactly is nullptr?
答案 2 :(得分: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()
函数避免了这种情况,因为结果不是编译时常量。