A volte fa ho visto un codice come questo:intelligente deleter puntatore e "con" parola chiave con un nome "puntatore"
void* Create()
{
int* t{new int{10}};
return t;
}
class Deleter
{
//uncomment in order to compile
//using pointer = void*;
public:
void operator()(void* t)
{
delete t;
}
};
unique_ptr<int, Deleter> ptr{Create()};
Non fa compila. Con VS2013 si dice:
error: C2440: 'initializing' : cannot convert from 'initializer-list' to 'std::unique_ptr' No constructor could take the source type, or constructor overload resolution was ambiguous
Ma se la linea rimuovere il commento using pointer = void*;
funziona! Anche se cambio un nome di alias in qualcosa di diverso da pointer
ottengo lo stesso errore. Sembra quindi che avere una direttiva using
con il nome esatto pointer
sia fondamentale. Ma perché? Non ho trovato nessuna spiegazione.