[gelöst]template Funktion wird vom Linker nicht erkannt
-
Hallo,
Ich hab mir eine kleine statische lib geschrieben, in der ich zwei Funktionen definiert habe. Eine die eine Pseudo-Zufallszahl zwischen 2 Werten zurückgibt und eine die einen Wert aus einem Array ( als template-Funktion ) zurückgibt.
Folgendes ist der Code dazu
// random.h int random( int min, int max ); // Pseudo-Zufallszahl erstellen template<class T> T randOfArr( T* arr, int size ); // Zufälliges Element aus Array auswählen// random.cpp #include <ctime> #include <cstdlib> #include "random.h" using namespace std; bool doonce = true; // Damit srand nur einmal initialisiert wird int random( int min, int max ) { if( doonce ) { srand( time(0) ); doonce = false; } return (rand() % max + min); } template<class T> T randOfArr( T* arr, int size ) { if( doonce ) { srand( time(0) ); doonce = false; } return arr[rand()%size]; }Dies lässt sich ohne Weiteres zu einer .lib kompilieren.
In einem Dev-Cpp Projekt habe ich nun die header-Datei included und die lib dem
Linker hinzugefügt.Folgenden Code hat das Test-Projekt für die Lib
// testrandom.cpp #include <iostream> #include "random.h" using namespace std; int main() { for( int i = 0; i < 20; i++ ) { cout << random( 0, 101 ) << endl; // Zufallszahl zwischen 0 und 100 } int size = 20; int* array = new int[size]; for( int i = 0; i < 20; i++ ) { // Array mit Werten belegen arr[i] = i*i; } for( int i = 0; i < 20; i++ ) { // Zufälligen Wert aus Array ausgeben cout << randOfArr( arr, size ) << endl; } delete[] arr; return 0; }Beim komplilieren bekomme ich nun folgende Fehlermeldung( Dev-Cpp ):
[Linker error] undefined reference to 'int randOfArr<int>(int*, int)'
Allerdings kann es nicht an der lib selber liegen da er die andere random Funktion auch erkennt. Daraus schließe ich dass er Probleme mit dem template hat.
Bitte kann mir jemand helfen.Danke im voraus
Gruß andre111
-
-
gut, danke
andre111
-
Im cpp ein export vor die Definition:
export template<class T> T randOfArr( T* arr, int size ) {...}Wenns dann immer noch nicht geht, unterstützt Dein Compiler das Separationsmodell nicht, und Du musst die Definition in den Header packen.
-
Tachyon schrieb:
Im cpp ein export vor die Definition:
export template<class T> T randOfArr( T* arr, int size ) {...}Wenns dann immer noch nicht geht, unterstützt Dein Compiler das Separationsmodell nicht, und Du musst die Definition in den Header packen.
Was sehr wahrscheinlich ist, ausser er hat Comeau..
-
ROFL
Immer diese sinnvollen Vorschläge.
Ein bisschen Realismus (-> "keiner" arbeitet mit einem Compiler der "export" unterstützt) könnte manchmal schon nicht schaden.bool doonce = true; // Damit srand nur einmal initialisiert wirdDas ist ganz schlechter Stil. Pack das lieber in die Funktion, so:
int random( int min, int max ) { static bool doonce = true; if( doonce ) { srand( time(0) ); doonce = false; } return (rand() % max + min); }Das ist zwar immer noch grausam, weil's mit mehreren Threads dann nicht so funktioniert wie erwartet, aber naja.
Tip: Verwende RNGs die aus einer eigenen Klasse bestehen, wie z.B. die Generatoren von Boost.Random. Dann ergibt sich das Problem mit dem Seeden nicht in der Form.
-
int random( int min, int max ) { static const bool doonce = ( srand( time(0) ), true ); return rand() % max + min; }
-
camper schrieb:
int random( int min, int max ) { static const bool doonce = ( srand( time(0) ), true ); return rand() % max + min; }ROFL
Immer diese sinnvollen Vorschläge.