Qual è la differenza tra il modello <typename T> e il modello <classe T>. Per me sono entrambi a generare lo stesso risultato

Qual è la differenza tra template <typename T> e template <class T>.
Per me sono entrambi a generare lo stesso risultato.

per esempio

template <class T>
T Average(T *atArray, int nNumValues)
{
    T tSum = 0;
    for (int nCount=0; nCount < nNumValues; nCount++)
        tSum += atArray[nCount];

    tSum /= nNumValues;
    return tSum;
}

se cambio è per template <typename T> è la stessa

InformationsquelleAutor user658266 | 2011-03-15

 

3 Replies
  1. 60

    Non c’è nessuna differenza. typename e class sono intercambiabili nella dichiarazione di un modello del tipo di parametro.

    È, tuttavia, per utilizzare class (e non typename) quando la dichiarazione di un modello parametro di modello:

    template <template <typename> class    T> class C { }; //valid!
    template <template <typename> typename T> class C { }; //invalid!  o noez!
    • +1 per la risposta migliore. Ho cancellato il mio. 😀
    • +1 per l’utilizzo di modello in modello
    • Sono stato morso da uno che, sapete se c’è qualche motivo per cui utilizzo non valido di typename in quella situazione ? Ho pensato che l’idea di typename era di riserva class per la dichiarazione / definizione di nuove classi.
    • Non credo che c’è un razionale, è successo e basta. Qualcuno ha voluto scrivere template<typename T> invece di template<class T>se T non è una classe. E ha ottenuto un “Perché no!” di risposta! Tutto il resto, di classe e di typename sono ancora diversi.
    • M. Se si guarda da vicino, fa apparire come una dichiarazione di classe (beh, una classe del modello di dichiarazione). E allo stesso modo che in caso di dichiarazione di un modello di classe è richiesto l’uso del class (o struct) per il tipo effettivo (!= argomenti), si sono tenuti a farlo qui. Trovo quantomeno coerente.
    • Ah! Vedo che logica ha un senso un po’.
    • Si noti che di C++17, salvo eventuali modifiche dell’ultimo minuto, template<typename> typename sarà valido.

  2. 4

    Sono equivalenti e intercambiabili, per la maggior parte delle volte, e alcuni preferiscono typename perché utilizzando la parola chiave classe in questo contesto sembra confuso.

    Il motivo per cui typename è necessaria per quei casi ambigui quando si utilizza template <class T> per esempio, è possibile definire un modello di questo tipo:

    template <class T>
    void MyMethod() {
       T::iterator * var;
    }

    e poi per qualche motivo l’utente del modello, decide di creare un’istanza della classe come questo

    class TestObject {
       static int iterator; //ambiguous
    };
    
    MyMethod<TestObject>(); //error

    Diventa ambiguo cosa var dovrebbe essere, un’istanza di una classe iteratore o il tipo statico int. Così, per questi casi, typename è stato introdotto per forza il modello di oggetto deve essere interpretato come un tipo.

Lascia un commento