11

Non riesco a capire perché la frase principale sia ambigua.Ambiguità di specializzazione modello parziale

template<class T, class U, int I> struct X 
{ void f() { cout << "Primary template" << endl; } }; 


template<class T, int I> struct X<T, T*, I> 
{void f() { cout << "Partial specialization 1" << endl;}}; 

template<class T, class U, int I> struct X<T*, U, I> 
{void f() { cout << "Partial specialization 2" << endl;}}; 

template<class T> struct X<int, T*, 10> 
{void f() { cout << "Partial specialization 3" << endl;}}; 

template<class T, class U, int I> struct X<T, U*, I> 
{void f() { cout << "Partial specialization 4" << endl;}}; 

int main() 
{ 
    X<int, int*, 10> f; 
} 

Non è il X<int, T*, 10> il modello più specializzato? Questo è un esempio da http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htm

+1

La ragione è riportata sotto l'esempio: Il compilatore non consentirebbe la dichiarazione 'X ' f perché può corrispondere a struct template 'X ', template struct 'X ', o template struct 'X ' e nessuna di queste dichiarazioni ha una corrispondenza migliore delle altre. –

risposta

10

Una specializzazione di modello è più specializzata di un'altra se ogni elenco di argomenti che corrisponde al primo corrisponde anche al secondo, ma non viceversa.

Se si guarda a X<int, T*, 10> e X<T, T*, I>:

  • X<int, float*, 10> corrisponde il primo ma non il secondo.
  • X<float, float*, 10> corrisponde al secondo ma non al primo.

Pertanto, nessuno dei due è più specializzato dell'altro e un'istanza di modello che corrisponde a entrambe le specializzazioni non verrà compilata.

+0

Indica inoltre l'ordinamento parziale delle specializzazioni del modello di classe, che a sua volta dipende dall'ordinamento parziale dei modelli di funzione * overloaded * composti dai parametri del modello delle specializzazioni del modello di classe. – Nawaz

+1

@Nawaz: So che è il modo in cui lo spiegano nello standard, ma penso che penso che complicherà le cose con poco beneficio per spiegare tutto qui (avrei anche bisogno di spiegare le regole per ordinare i modelli di funzione da 14.5. 5.2 e deduzione argomento modello da 14.8.2). Sentiti libero di aggiungere una risposta se pensi che questo abbia bisogno di maggiori dettagli. – interjay

+0

Grazie, ora lo capisco. Ho letto la spiegazione alla fine, ma non sono riuscito a capire perché "X " non fosse il più specializzato. – user1116459

Problemi correlati