[c++] Differenza delle parole chiave "typename" e "class" nei template?



Answers

Per i parametri del modello di denominazione, typename e class sono equivalenti. §14.1.2:

Non c'è alcuna differenza semantica tra classe e nome tipografico in un parametro template.

typename tuttavia è possibile in un altro contesto quando si usano i template - per suggerire al compilatore che si sta facendo riferimento a un tipo dipendente. §14.6.2:

Si presume che un nome utilizzato in una dichiarazione o una definizione di modello e dipendente da un parametro del modello non indichi un tipo a meno che la ricerca del nome applicabile non trovi un nome di tipo o il nome sia qualificato dalla parola chiave typename.

Esempio:

typename some_template<T>::some_type

Senza typename il compilatore non può dire in generale se si riferisce a un tipo o meno.

Question

Per i modelli ho visto entrambe le dichiarazioni:

template < typename T >
template < class T >

Qual è la differenza?

E cosa significano esattamente queste parole chiave nel seguente esempio (tratto dall'articolo di Wikipedia in tedesco sui modelli)?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};



  1. Nessuna differenza
  2. Parametro del tipo di modello Container è esso stesso un modello con due parametri di tipo.



Links