Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con la specializzazione dei templates
Forum - C/C++ - Problema con la specializzazione dei templates

Avatar
napco (Normal User)
Pro


Messaggi: 64
Iscritto: 16/04/2010

Segnala al moderatore
Postato alle 15:32
Domenica, 20/06/2010
Ciao a tutti! Cercando di utilizzare funzioni template e specializzazioni mi sono ritrovato di fronte ad un problemuccio:

Codice sorgente - presumibilmente C++

  1. // Blah.h
  2. #pragma once
  3. #include <string>
  4.  
  5. class Blah
  6. {
  7.     // Blah
  8. };
  9.  
  10. template<typename T> Blah &operator >>(Blah &b, T &t) // Template
  11. {
  12.     // Blah
  13.     return b;
  14. }
  15.  
  16. template<> Blah &operator >><std::string>(Blah &b, std::string &s) // Specializzazione
  17. {
  18.     // Blah
  19.     return b;
  20. }



Codice sorgente - presumibilmente C/C++

  1. // Blah.cpp
  2. #include "Blah.h"
  3.  
  4. // Definizione della classe Blah (trascurabile)



Codice sorgente - presumibilmente C++

  1. // main.cpp
  2. #include <iostream>
  3. #include "Blah.h"
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7.     system("pause");
  8.     return 0;
  9. }



Al momento della compilazione (con VC++ 2008 express) ricevo errore di definizione multipla della specializzazione operator >><std::string> (non ricordo il messaggio preciso, purtroppo sono fuori casa). Se dal main non includo "Blah.h", se implemento la classe Blah direttamente nell'header eliminando il relativo .cpp, o se rimuovo la specializzazione della funzione template, l'errore scompare. E' come se il compilatore ignorasse il #pragma once (o #ifndef/#define/#endif), tentando di definire 2 volte la seconda funzione (ad ogni #include "Blah.h"). Da niubbo ho cercato di aggirare il problema dichiarando la specializzazione come funzione normale (Blah &operator >>(Blah &b, std::string &s)), ma almomento della chiamata quella template ha la precedenza. Come posso fare per risolvere questo problema?

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 19:02
Domenica, 20/06/2010

quando usi i template metti nel .h sia le definizioni che le implementazioni, di solito aiuta con errori di questo genere :)

PM Quote
Avatar
napco (Normal User)
Pro


Messaggi: 64
Iscritto: 16/04/2010

Segnala al moderatore
Postato alle 21:20
Domenica, 20/06/2010
Sisi, nel .cpp non compare neanche l'ombra dei template, ma niente da fare purtroppo. Sempre lo stesso errore di definizione multipla della specializzazione. L'unica soluzione che mi viene in mente è quella di creare un overload per ogni tipo di dato, senza usare il template. In alternativa potrei trasformare le funzioni di overload degli operatori in metodi della classe stessa. In quest'ultimo modo compila tranquillamente (anche se non ne capisco il motivo), ma ho letto da qualche parte che l'overloading degli operatori come metodo di classe è sconsigliato.

PM Quote