Errori, bug, domande - pagina 2006

 
fxsaber:

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

class A {};
void f( A * const ) {}
void OnStart()
{
        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 {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

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

 
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?
 
A100:

Errore di compilazione

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        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 {};
void OnStart()
{
          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 {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

Cosa è cambiato fondamentalmente?

La differenza è enorme! Questo è quello che hai chiamato.

void B<const A*>::f(const A*,const A*)
Il compilatore va in errore nel senso che non riesce a capire la versione corretta del template. Ovviamente gliel'ha detto.
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

E funziona.

 
fxsaber:
E funziona.

Perché i caratteri extra?

 
A100:

Perché i caratteri extra?

Per mostrare che il compilatore non indovina una versione perfettamente funzionante del modello.

 
fxsaber:

Per mostrare che il compilatore non indovina una versione perfettamente funzionante del modello.

Perché dovrebbe? ServiceDesk può capirlo da solo

 
A100:

Perché?

A giudicare dalla vostra specializzazione, il tipo dovrebbe essere scartato, cosa che fa. Se si specifica esplicitamente il tipo corretto, ovviamente si compila.