Я уверен, что это, должно быть, уже было здесь, но я не нашел много информации о том, как решить эту проблему (без кастования вызова):
Учитывая две перегрузки, я хочу, чтобы вызов с функцией с литералом 0 всегда вызывал неподписанную версию int:
void func( unsigned int ) {
cout << "unsigned int" << endl;
}
void func( void * ) {
cout << "void *" << endl;
}
func( 0 ); // error: ambiguous call
Я понимаю, почему это происходит, но я не хочу писать func (0u) или даже func (static_cast (0)) все время. Поэтому мои вопросы:
1) Есть ли рекомендуемый способ сделать это в целом?
2) Есть ли какие-либо проблемы с этим следующим образом и в чем причина этого?
void func( unsigned int ) {
cout << "unsigned int" << endl;
}
template <typename T>
void func( T * ) {
static_assert( std::is_same<T, void>::value, "only void pointers allowed" );
cout << "void *" << endl;
}
func( 0 ); // calls func( unsigned int )!