C++ Array an template Funktion übergeben

Ich teste schon die ganze Zeit an verschieden Arten rum, bekomme es einfach nicht hin. Bei googlen stoß ich die ganze zeit nur auf template Klassen.

Ich möchte ein array an eine template FUNKTION übergeben.

Bitte um Hilfe
 
Code:
#include <iostream>

using namespace std;

template<class T> void function(T *array, size_t size)
{
	for (size_t i = 0; i < size; ++i)
		cout << " " <<  array[i];
}

int main (int, char**)
{
	int array[] = {4, -2, 3, 1, 30};
	
	function(array, 5);
	cout << endl;
	
	return 0;
}

mfg benediktibk
 
Wie muss die dementsprechende Header File aussehen?

Code:
template<class T> void sortWithoutReturn(T *array, size_t size);

funktioniert nicht.


edit: undefined reference to `void function<int>(int*, unsigned long)'

wenn man eine seperate header und source file benutzt.
 
Zuletzt bearbeitet:
Bei einem Template muss immer auch die Implementierung bekannt sein, weil der Compiler dann ja bei Bedarf daraus Code generiert. Du hast aber mehrere Möglichkeiten:
  • Sämtliche Implementierungen in den Header packen
  • Alle benötigen Instantiierungen des Templates explizit mit hinein kompilieren
  • Die Source-Datei mit den Implementierungen im Header inkludieren

Alternative 1 wird meiner Meinung nach unübersichtlich, Nummer 2 ist recht unpraktisch, da man ja explizit die Datentypen bei einem Template nicht angeben möchte. Deswegen verwende ich gerne die dritte Variante.

function.h
Code:
#ifndef FUNCTION_H
#define FUNCTION_H

template<class T> void function(T *array, size_t size);

#include "function.cpp"

#endif

function.cpp
Code:
#include "function.h"

using namespace std;

template<class T> void function(T *array, size_t size)
{
	for (size_t i = 0; i < size; ++i)
		cout << " " <<  array[i];
}

main.cpp
Code:
#include <iostream>
#include "function.h"

int main (int, char**)
{
	int array[] = {4, -2, 3, 1, 30};
	
	function(array, 5);
	cout << endl;
	
	return 0;
}

mfg benediktibk
 
Bei Benedikts Lösung sollte man der Vollständigkeit halber die Datei aber nicht mehr Function.cpp nennen, sondern z.B FunctionImpl.h oder Function.inl (oder den Code gleich in den Header werfen).

Sonst musst du in deinem Buildsystem zwischen .cpp Dateien die selbst kompiliert, und solchen die nur inkludiert werden unterscheiden (wenn nicht werden die Files ja 2x kompiliert).
 
Bei Benedikts Lösung sollte man der Vollständigkeit halber die Datei aber nicht mehr Function.cpp nennen, sondern z.B FunctionImpl.h oder Function.inl (oder den Code gleich in den Header werfen).

Sonst musst du in deinem Buildsystem zwischen .cpp Dateien die selbst kompiliert, und solchen die nur inkludiert werden unterscheiden (wenn nicht werden die Files ja 2x kompiliert).

Das hängt aber voll und ganz vom Buildsystem ab. Wenn man die Source-Dateien sowieso einzeln angeben muss ist es kein Problem. Falls allerdings automatisch alle Dateien mit der Endung cpp als Source-Dateien behandelt werden hast du natürlich recht. Wobei natürlich auch wieder nur dann, wenn Sources und Header im selben Pfad liegen ... usw. Wie man sieht, dafür gibts keine allgemeingültige Aussage.

mfg benediktibk
 
Natürlich kann man das alles per Hand festlegen, aber es sorgt halt nicht gerade für Übersicht.
Vor allem wenn das Projekt etwas größer wird, andere mit dem Code arbeiten sollen, oder man ihn irgendwann wiederverwenden will wirds sonst mühsam. :wink:
 
Das brauchst du mir nicht zu sagen, nur habe ich selber schon das Vergnügen gehabt an einem doch recht großen Projekt in einer Firma zu arbeiten, bei dem man das alles per Hand in das selber erstellte Buildsystem rein klopfen musste. Ich habe auch schon mal gesehen, das Makefiles aus Makefiles generiert wurden. Was ich damit sagen will: Es gibt nichts, was es nicht gibt. Und es gibt in etwas so viele Buildsysteme wie Programmierer auf dieser Welt.

mfg benediktibk
 
Zurück
Oben