Sind Template Methoden auch automatisch inline ?

Anfangs weder noch, die Explizite Typeninstanzierung war erst erforderlich als ich eine lib draus erzeugt hab...

wie auch immer, ich halte nix davon methoden in H dateien zu schreiben, gibts nämlich gern ärger mit dem linker, weil er dann wenn man die mehrmals verwendet oft doppelt existieren und der linker dann nie weiß welche er benutzen soll.

Naja Egal, solange es funktioniert passt es.
 
Kannst Du mal den Code posten (wenn er jetzt nicht geheim bzw. vertraglich geschützt ist) ? Jetzt interessiert es mich wirklich mal, wie Du das gemacht hast.

MfG

Tobias
 
hab ich das richtig verstanden das chibisuke template-methoden in cpp dateien definiert hat ?
dann darf diese cpp aber nicht mit kompiliert werden oder ?
 
Nein, eigentlich nicht, den Grund hatte ich ja schon weiter oben geschrieben. Deshalb habe ich ja auch extra nach dem Quellcode gefragt, weil mich interessiert, wie er das gemacht hat.
 
Also ich würde dir ja das gesamte projekt als source geben, damit du es selbst kompilieren kannst, aber 1.) is das projekt mittlerweile 40MB reiner source, und 2.) sind große teile des codes aus sicherheitsgründen unter verschluss.(cryptographierechniken, übertragungsprotokolle, ..)

Die klasse von der ich rede is so simple,dass ich sie dir zeichen kann.

aus corelib.lib:

Code:
// -------------------------------------------------
// CHashtable.cpp
// -------------------------------------------------
// (c) 2003, BeamVision
// Alle Rechte vorbehalten 
// -------------------------------------------------

#include "../common/CHashtable.h"

///////////////////////////////////////////////////////////////
// TEMPLATE T: class to use as a class for the Hashtable
///////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////
// constructs the element
//
template <class T> CHashtable<T>::CHashtable() {
	this->data = new CArray();
}
   
///////////////////////////////////////////////////////////////
// every element entered in the hashtable is deleted
//    when it is removed
//
template <class T> CHashtable<T>::~CHashtable() {
	for(unsigned int i = 0; i < this->data->countItems(); i++) {
		if(this->data->GetItem(i) != NULL) {
			delete this->data->GetItem(i);
		}
	}
	delete this->data;
}

/////////////////////////////////////////////////////////////
// retrived a entry of the hashtable
// @param: the name of the assiciated object
// @return: Template type entry associated with the name
//
template <class T> T* CHashtable<T>::get(char* name) {
	CHashtableEntry<T> *tmp1;
	for(unsigned int i = 0; i < this->data->countItems(); i++) {
		if(this->data->GetItem(i) != NULL) {
			tmp1 = (CHashtableEntry<T>*)this->data->GetItem(i);
			if(_stricmp(tmp1->name, name) == NULL) {
				return (T*)((CHashtableEntry*)this->data->GetItem(i))->object;
			}
		}
	}
	return NULL; 
}

/////////////////////////////////////////////////////////////
// adds a new element to the Hashtable
// @param: name of the object, is duplicated afterwards
// @param: pointer to the object to insert, should be
//         allocated on the heap
//
template <class T> void CHashtable<T>::insert(char* name, T* obj) {
	this->data->AddItem(new CHashtableEntry<T>(obj, strdup(name)));	
}

/////////////////////////////////////////////////////////////
// removes and deletes a specified item from the 
//           hashtable
// @param: name of the element
//
template <class T> void CHashtable<T>::remove(char* name) {
	for(unsigned int i = 0; i < this->data->countItems(); i++) {
		if(this->data->GetItem(i) != NULL) {
			if(_stricmp(((CHashtableEntry*)this->data->GetItem(i))->name, name) == NULL) {
				delete ((CHashtableEntry*)this->data->GetItem(i));
				this->data->DeleteItem(i);
			}
		}
	}
}

////////////////////////////////////////////////////////////////
// contructs a new Hashtable entry, should not be
//        used by any other element then CHashtable and childs
// @param: object to insert
// @param: name to be duplicated and inserted
//
template <class T> CHashtableEntry<T>::CHashtableEntry(T* obj, char* name) {
	this->object = obj;
	this->name = _strdup(name);
}

////////////////////////////////////////////////////////////////
// this ctor is only for use in exceptional cases
//        it should not be used regularly
// 
template <class T> CHashtableEntry<T>::CHashtableEntry() {
	this->name = NULL;
	this->object = NULL;
}

////////////////////////////////////////////////////////////////
// destructs the element, and deletes any associated values
template <class T> CHashtableEntry<T>::~CHashtableEntry() {
	if(this->name) {
		delete this->name;
	}
	if(this->object) {
		delete this->object;
	}
}

/////////////////////////////////////////////////////////////////
// Create Virtual instance of CHashtable
//       this must be done 'cause we are working inside
//       a library.

template class CHashtable<char>;
template class CHashtable<_CObject>;
template class CHashtableEntry<char>;
template class CHashtableEntry<_CObject>;

Code:
#pragma once
// -------------------------------------------------
// CHashtable.h
// -------------------------------------------------
// (c) 2003, BeamVision
// Alle Rechte vorbehalten
// -------------------------------------------------

//TEMPLATE-CLASS

#include "CArray.h"
#include <string.h>
#ifndef NULL
#	define NULL 0
#endif

template <class T> class CHashtable :public _CObject {
	public:
		CHashtable();
		~CHashtable();

		T* get(char* name);
		void insert(char* name, T* obj);
		void remove(char* name);

	protected:
		CArray* data;
};

template <class T> class CHashtableEntry :public ::_CObject {
	public:
		CHashtableEntry();
		CHashtableEntry(T*, char*);
		~CHashtableEntry();

		T* object;
		char* name;
};

Während ich die klasse geschrieben und getestat hab hatte sie noch keine explizite instanzierung, und war in der haupt DLL enthalten. Nachdem die Tests abgeschlossen waren, kam sie in éine lib, was die explizite instanzierung erforderlich machte.seither wurde nichts mehr verändert.

Verwendung natürlich wie auch sonst üblich, header einbinden, CPP datei einfügen ins projekt, und los gehts...
eventuell ein typedef...wenn man zu faul ist jedesmal diese <T> anzugeben...

Der code stammt aus meinem aktuellen projekt Chimera-Crystals.
 
Zuletzt bearbeitet:
CHashtable.h natürlich

Ist ja die einzige datei die in ../common/ liegt die damit zu tun hatt...
Was anderes würde ja die struktur des projekte durcheinander bringen ;-)
 
Zurück