繁体   English   中英

模糊调用重载函数

[英]ambiguous call to overloaded function

我有两个功能:

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类型为int ,而不是size_t 它可以转换为size_t或指针,所以如果你有两者的重载,它是不明确的。 一般来说,我建议如果你有重载函数,其中一个可以采用整数类型,你可以为int添加一个重载,可能是这样的:

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

Integral literals默认使用int类型(除非它们太大而不适合int ),并且通过提供完全匹配,可以避免任何歧义。

歧义原因: NULL的数值为0

如果在传递0作为参数时你想要void DoSomething( const tchar* apsValue )nullptr将会有所帮助。 检查这究竟是什么nullptr?

#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()函数避免了这一点,因为结果不是编译时常量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM