7

我有两个功能:

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));

其中一个比另一个更好吗?有没有其他方法可以解决这个问题?

4

3 回答 3

7

这是模棱两可的,因为0有 type int,而不是size_t。它可以转换为一个size_t或一个指针,所以如果你有两者的重载,它是模棱两可的。一般来说,我建议如果您有重载函数,并且其中一个可以采用整数类型,则为 增加一个重载int,可能类似于:

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隐式转换为空指针。例如,该null()函数避免了这种情况,因为结果不是编译时间常数。

于 2012-02-21T12:59:16.990 回答