Oppure

Loading
02/04/10 8:56
robrock80
Salve a tutti. Dato la seguente classe base definita in un file header


template<class Type>
		class _Command{
			public :
				_Command(){};
				virtual ~_Command();
				//Funzione virtuale pura
				virtual bool execute(Type&) = 0;
				virtual char* getId();
				virtual char* getDescription();
				virtual char* getMessage(int idx);
			protected:
				char* id;
				char* description;
				char** messages;
				virtual void createMessagesArray(int size);
			private:
				int messagesLength;
		};




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



template <class Type>
_Command<Type>::~_Command(){
	if(messages!=0) {
		freeSizeKnownCharMatrix(messages, messagesLength);
	}
}


template <class Type>
char* _Command<Type>::getId() {
	return this->id;
}


template <class Type>
char* _Command<Type>::getDescription(){
	return this->description;
}


template <class Type>
char* _Command<Type>::getMessage(int idx) {
	return this->messages[idx];
}


template <class Type>
void _Command<Type>::createMessagesArray(int size) {
	if(messages == 0) {
		messagesLength = size;
		this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
	} else {
		freeSizeKnownCharMatrix(messages, messagesLength);
		messagesLength = size;
		this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
	}
}





Perchè quando vado a richiamare i suoi metodi in una classe figlio di una classe figlio con il codice
_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

	template<class Type>
	class _Command{
		public :
			_Command(){};
			virtual ~_Command(){
				if(messages!=0) {
					freeSizeKnownCharMatrix(messages, messagesLength);
				}
			}
			//Funzione virtuale pura
			virtual bool execute(Type&) = 0;
			virtual char* getId(){
				return this->id;
			}
			virtual char* getDescription(){
				return this->description;
			}
			virtual char* getMessage(int idx){
				return this->messages[idx];
			}
		protected:
			char* id;
			char* description;
			char** messages;
			virtual void createMessagesArray(int size){
				if(messages == 0) {
					messagesLength = size;
					this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
				} else {
					freeSizeKnownCharMatrix(messages, messagesLength);
					messagesLength = size;
					this->messages = (char**)malloc(sizeof(char*) * (messagesLength));
				}
			}
		private:
			int messagesLength;
	};



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

aaa
02/04/10 9:22
TheKaneB
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 :-)
aaa
02/04/10 9:34
robrock80
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?
aaa
02/04/10 9:46
TheKaneB
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
aaa
02/04/10 9:53
robrock80
Io uso gcc.. Grazie mille: mi hai evitato ore di sbattimenti :k:
aaa