In generale, uso raramente i modelli - non sono entrato nei dettagli - posso solo spiegare a livello intuitivo
Nel 2° caso, una sostituzione diretta di T con A* si compila bene - quindi anche il template dovrebbe compilare
class A {};
void f( A * const ) {}
voidOnStart()
{
A *a;
f( a ); //нормально
}
Nel 1° caso, una sostituzione diretta non funziona, ma si può aggiungere il parametro ridondante T2 - con esso si compila normalmente - quindi dovrebbe farlo senza - ecco perché è ridondante
template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
voidOnStart()
{
const A *a;
f( a, a ); //нормально
}
Il valore di drawdown nella tabella di ottimizzazione è visualizzato in modo strano. Mostra il drawdown massimo per mezzo (ma è scritto in percentuale). Ma dopo un solo test si scopre che il drawdown relativo differisce da quello massimo (la percentuale è maggiore o minore). Quando si usa la gestione del denaro, è necessario aggiungere qualcos'altro per visualizzare i risultati richiesti?
template<typename T>
void f( T, const T ) {}
class A {};
voidOnStart()
{
A * const a = new A;
f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
È così che si compila, la versione originale non dovrebbe.
Комбинатор: È così che si compila, la versione originale non dovrebbe.
Perché?
template<typename T>
struct B {
void f( T, const T ) {}
};
class A {};
voidOnStart()
{
const A* a;
B<const A*> b;
b.f( a, a ); //нормально
}
Quindi va bene. Cosa è cambiato in linea di principio?
template<typename T>
void f( T, const T ) {}
class A {};
voidOnStart()
{
const A *a;
f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
A giudicare dalla vostra specializzazione, il tipo dovrebbe essere scartato, cosa che fa. Se si specifica esplicitamente il tipo corretto, ovviamente si compila.
Perché entrambi dovrebbero compilare?
In generale, uso raramente i modelli - non sono entrato nei dettagli - posso solo spiegare a livello intuitivo
Nel 2° caso, una sostituzione diretta di T con A* si compila bene - quindi anche il template dovrebbe compilare
Nel 1° caso, una sostituzione diretta non funziona, ma si può aggiungere il parametro ridondante T2 - con esso si compila normalmente - quindi dovrebbe farlo senza - ecco perché è ridondante
Intuitivamente, const è a volte parte di un tipo e a volte solo un identificatore, che all'interno della funzione il puntatore sarà const.
Questo può essere percepito attraversoPrint(__FUNCSIG__);
Errore di compilazione
È così che si compila, la versione originale non dovrebbe.
Perché?
Quindi va bene. Cosa è cambiato in linea di principio?
Cosa è cambiato fondamentalmente?
La differenza è enorme! Questo è quello che hai chiamato.
Il compilatore va in errore nel senso che non riesce a capire la versione corretta del template. Ovviamente gliel'ha detto.E funziona.
E funziona.
Perché i caratteri extra?
Perché i caratteri extra?
Per mostrare che il compilatore non indovina una versione perfettamente funzionante del modello.
Per mostrare che il compilatore non indovina una versione perfettamente funzionante del modello.
Perché dovrebbe? ServiceDesk può capirlo da solo
Perché?