[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.

    @andre111:

    bool doonce = true; // Damit srand nur einmal initialisiert wird
    

    Das 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.


  • Mod

    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.


Anmelden zum Antworten