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++ - Templates ed ereditarietà
Forum - C/C++ - Templates ed ereditarietà

Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 10:56
Venerdì, 02/04/2010
Salve a tutti. Dato la seguente classe base definita in un file header

Codice sorgente - presumibilmente C++

  1. template<class Type>
  2.                 class _Command{
  3.                         public :
  4.                                 _Command(){};
  5.                                 virtual ~_Command();
  6.                                 //Funzione virtuale pura
  7.                                 virtual bool execute(Type&) = 0;
  8.                                 virtual char* getId();
  9.                                 virtual char* getDescription();
  10.                                 virtual char* getMessage(int idx);
  11.                         protected:
  12.                                 char* id;
  13.                                 char* description;
  14.                                 char** messages;
  15.                                 virtual void createMessagesArray(int size);
  16.                         private:
  17.                                 int messagesLength;
  18.                 };




e il codice di implementazione di tutti i metodi virtuali meno che uno


Codice sorgente - presumibilmente C++

  1. template <class Type>
  2. _Command<Type>::~_Command(){
  3.         if(messages!=0) {
  4.                 freeSizeKnownCharMatrix(messages, messagesLength);
  5.         }
  6. }
  7.  
  8.  
  9. template <class Type>
  10. char* _Command<Type>::getId() {
  11.         return this->id;
  12. }
  13.  
  14.  
  15. template <class Type>
  16. char* _Command<Type>::getDescription(){
  17.         return this->description;
  18. }
  19.  
  20.  
  21. template <class Type>
  22. char* _Command<Type>::getMessage(int idx) {
  23.         return this->messages[idx];
  24. }
  25.  
  26.  
  27. template <class Type>
  28. void _Command<Type>::createMessagesArray(int size) {
  29.         if(messages == 0) {
  30.                 messagesLength = size;
  31.                 this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
  32.         } else {
  33.                 freeSizeKnownCharMatrix(messages, messagesLength);
  34.                 messagesLength = size;
  35.                 this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
  36.         }
  37. }




Perchè quando vado a richiamare i suoi metodi in una classe figlio di una classe figlio con il codice
Codice sorgente - presumibilmente Plain Text

  1. _Command::createMessagesArray(3);

il compilatore mi dice template<class Type> class _Command' used without template parameters?


P.S.: se nell'header invece scrivo la classe in questa maniera
Codice sorgente - presumibilmente C++

  1. template<class Type>
  2.         class _Command{
  3.                 public :
  4.                         _Command(){};
  5.                         virtual ~_Command(){
  6.                                 if(messages!=0) {
  7.                                         freeSizeKnownCharMatrix(messages, messagesLength);
  8.                                 }
  9.                         }
  10.                         //Funzione virtuale pura
  11.                         virtual bool execute(Type&) = 0;
  12.                         virtual char* getId(){
  13.                                 return this->id;
  14.                         }
  15.                         virtual char* getDescription(){
  16.                                 return this->description;
  17.                         }
  18.                         virtual char* getMessage(int idx){
  19.                                 return this->messages[idx];
  20.                         }
  21.                 protected:
  22.                         char* id;
  23.                         char* description;
  24.                         char** messages;
  25.                         virtual void createMessagesArray(int size){
  26.                                 if(messages == 0) {
  27.                                         messagesLength = size;
  28.                                         this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
  29.                                 } else {
  30.                                         freeSizeKnownCharMatrix(messages, messagesLength);
  31.                                         messagesLength = size;
  32.                                         this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
  33.                                 }
  34.                         }
  35.                 private:
  36.                         int messagesLength;
  37.         };



tutto funziona, ma io vorrei scrivere l'implementazione dei metodi in un file .cpp


PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 11:22
Venerdì, 02/04/2010
le classi template vengono "esplose" dal preprocessore, quindi non c'è modo di mettere le relative implementazioni nel .cpp, nonostante lo standard lo consenta (in teoria).

Purtroppo è una cosa con cui devi convivere :-)

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 11:34
Venerdì, 02/04/2010
Cioè mi stai dicendo che nel documento ANSI/ISO delle specifiche del C++ è definito che è possibile scrivere in quella maniera ma di fatto i compilatori non supportano questa caratteristica?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 11:46
Venerdì, 02/04/2010
per essere sinceri, non so se sia esplicitamente descritto nel documento ANSI/ISO. Però posso dirti con certezza che ogni compilatore ha un modo tutto suo di implementare i templates, e tra quelli che uso giornalmente (Visual Studio 2005, GCC 4.1 ed SNC) nessuno supporta i template implementati nel .cpp

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 11:53
Venerdì, 02/04/2010
Io uso gcc.. Grazie mille: mi hai evitato ore di sbattimenti :k:

PM Quote