Ho cercato di trovare una citazione succinta dallo standard, ma non penso che prima è uno. Il fatto è che non esiste una specializzazione parziale di una funzione template (o, peraltro, di un alias template). Solo i modelli di classe possono avere specializzazioni parziali.
Dimentichiamo i modelli per un secondo. In C++, c'è una grande differenza tra nomi di classi e nomi di funzioni. Può esserci solo una definizione di una classe all'interno di un determinato ambito. (Puoi avere varie dichiarazioni, ma si riferiscono tutte alla One True Class.) Quindi il nome identifica davvero la classe.
Un nome di funzione, d'altra parte, è un tipo di identità di gruppo. È possibile definire qualsiasi numero di funzioni all'interno di un ambito con esattamente lo stesso nome. Quando si utilizza un nome di funzione per chiamare una funzione, il compilatore deve capire quale funzione si intendesse realmente, osservando le varie possibilità e facendo corrispondere la firma di ognuna di esse con gli argomenti forniti. Non c'è alcuna relazione tra le varie funzioni che condividono un nome; sono entità completamente separate.
Quindi, nessun grosso problema. Sapevi tutto questo, vero? Ma ora torniamo ai modelli.
Il nome di una classe basata su modelli è ancora univoco.Sebbene sia possibile definire specializzazioni parziali, è necessario specializzarsi esplicitamente nella stessa classe basata su modelli. Questo meccanismo sembra superficialmente simile all'algoritmo di risoluzione del nome di funzione di cui sopra, ma ci sono differenze significative - una di queste è che, a differenza dei prototipi di funzione, non è possibile avere due modelli di classe nello stesso ambito con diversi tipi di parametri del modello.
Le funzioni basate su modelli, d'altra parte, non hanno bisogno di definire nomi univoci. I modelli non sostituiscono il normale meccanismo di sovraccarico delle funzioni. Quindi, quando il compilatore sta cercando di capire cosa significhi un nome di funzione, deve prendere in considerazione tutte le dichiarazioni basate su modelli e senza modelli per quel nome di funzione, risolvere i modelli su un insieme di assegnazioni dei parametri del modello (se possibile) e poi una volta ha una lista di possibili oggetti funzione, seleziona la migliore con normale risoluzione di sovraccarico.
Questo è un algoritmo piuttosto diverso dalla risoluzione dei parametri del modello di classe con modelli. Invece di abbinare semplicemente una lista di argomenti template forniti con una lista di parametri template dichiarati, che è come risolve i template di classe, deve prendere ogni funzione basata su template che potrebbe eventualmente corrispondere (ha almeno il giusto numero di parametri, per esempio) ; dedurre i parametri del modello unificando gli argomenti forniti con il modello; e quindi aggiungere la specializzazione di risoluzione al set di sovraccarico per un ulteriore ciclo di risoluzione del sovraccarico.
Suppongo che sarebbe stato possibile aggiungere una risoluzione di specializzazione parziale anche a quel processo, ma le interazioni tra specializzazione parziale e sovraccarico di funzioni mi sembrano più propensi a condurre a comportamenti pseudo-magici. Nel caso, non era necessario e quindi non esiste un tale meccanismo. (È possibile specializzarsi completamente un modello di funzione di specializzazione completa significa che non ci sono argomenti template a dedurre, quindi non è un problema..)
Ecco, questo è lo scoop: non è possibile specializzarsi in parte una funzione di template, ma c'è nulla ti impedisce di fornire un numero qualsiasi di modelli di funzioni con lo stesso nome. Tutti saranno considerati in risoluzione di sovraccarico, e il migliore vincerà, come al solito.
Di solito, questo è effettivamente sufficiente per le vostre esigenze di sovraccarico. Dovresti pensare alle funzioni basate su modelli allo stesso modo in cui pensi alle normali funzioni: scegli un modo per selezionare quello che vuoi in base agli argomenti forniti. Se ritieni che sia necessario fornire parametri di template in una chiamata di funzione, piuttosto che averli dedotti, basta rendere la funzione un membro (possibilmente statico) di una classe basata su modelli e fornire gli argomenti del template alla classe.
Speranza che aiuta ...
Quasi duplicato: http://stackoverflow.com/questions/12335762/partial-specialization-of-member-function e http://stackoverflow.com/questions/165101/invalid-use-of-incomplete-type- error-con-parziale-template-specializzazione. – jogojapan