Errore “uso non valido di tipo incompleto” con specializzazione del modello parziale

Il seguente codice:

template  struct foo { void bar(); }; template  void foo ::bar() { } 

mi dà l’errore

 invalid use of incomplete type 'struct foo' declaration of 'struct foo' 

(Sto usando gcc.) La mia syntax per la specializzazione parziale è errata? Si noti che se rimuovo il secondo argomento:

 template  struct foo { void bar(); }; template  void foo ::bar() { } 

quindi compila correttamente.

Non è ansible specializzare parzialmente una funzione. Se desideri farlo con una funzione membro, devi parzialmente specializzare l’intero modello (sì, è irritante). Su una grande class basata su modelli, per specializzare parzialmente una funzione, è necessaria una soluzione alternativa. Potrebbe funzionare una struttura di membro basata su modelli (ad es. template struct Nested ). Oppure puoi provare a derivare da un altro template che si specializza parzialmente (funziona se usi la notazione this->member , altrimenti incontrerai errori del compilatore).

Anche se coppro ha già menzionato due soluzioni e Anonymous ha spiegato la seconda, mi ci è voluto un po ‘di tempo per capire il primo. Forse il codice seguente è utile per qualcuno che inciampa su questo sito, che si trova ancora in alto in google, come me. L’esempio (passare un vettore / array / singolo elemento di numericaT come dataT e quindi accedervi tramite [] o direttamente) è ovviamente un po ‘forzato, ma dovrebbe illustrare come effettivamente si può avvicinarsi a specializzare parzialmente una funzione membro avvolgendola in una class parzialmente specializzata.

 /* The following circumvents the impossible partial specialization of a member function actualClass::access as well as the non-nonsensical full specialisation of the possibly very big actualClass. */ //helper: template  class specialised{ public: numericalT& access(dataT& x, const unsigned int index){return x[index];} }; //partial specialisation: template  class specialised{ public: numericalT& access(dataT& x, const unsigned int index){return x;} }; //your actual class: template  class actualClass{ private: dataT x; specialised accessor; public: //... for(int i=0;i 

Se hai bisogno di specializzare parzialmente un costruttore, potresti provare qualcosa come:

 template  struct thingBase { //Data members and other stuff. }; template  struct thing : thingBase {}; template  struct thing : thingBase { thing(T * param1, wchar_t * param2) { //Special construction if N equals 42. } }; 

Nota: questo è stato reso anonimo da qualcosa a cui sto lavorando. Puoi anche usarlo quando hai una class template con molti e molti membri e vuoi semplicemente aggiungere una funzione.