[sry falsches forum] Funktion zur typsicheren Eingabe in dll



  • Hallo, ich habe mir gerade eine Funktion geschrieben die die Eingabe von falschen Datentypen verhinerdn soll (also zB dass char in eine int-variable eingegeben wird).

    hier mal der Code zur Funktion:

    template<class T>  void safe_cin(T& Zielvariable) 
    {  
        do
        {
    		cin>>Zielvariable;
            if(cin.fail())
            {
                cin.clear();   //fail-state vergessen
                cin.ignore(); //Zeichen im Stream vergessen
                cout<<"Fehleingabe, bitt erneut eingeben!\n";
            }
        }
        while(cin.fail());
    }
    

    wenn ich die ganz normal in der main.cpp einer Konsolenanwendung definiere und aufrufe funktioniert sie perfekt 🙂 .

    aber wenn ich die Funktion jetzt völlig unverändert in eine dll kopiere, mit der folgenden Zeile in meien Konsolenanwendung importiere:

    template<class T>
     __declspec(dllimport) void safe_cin(T& Zielvariable);
    

    und dann ganz normal aufrufe bringt der Compiler (MS Visual C++ 2008 EE) die folgende Fehlermeldung:

    Microsoft Visual C++ 2008 Express Edition schrieb:

    1 nicht aufgelöste externe Verweise

    (natürlich habe ich die dll und lib entsprechend gelinkt und ins richtige verzeichnis kopiert,außerdem findet der compiler andere funktionen aus derselben dll ja auch, daran liegts also nicht 😉 )

    in der dll dekleriere ich die Funktion so:

    template<class T> 
     __declspec(dllexport) void safe_cin(T& Zielvariable) 
    {
    //siehe oben
    }
    

    woran liegt das mit der Fehlermeldung und was muss ich anders machen?

    danke schonmal,
    andi01.



  • upps falsches forum xD



  • Du hast dir keine Funktion geschrieben, sondern eine Funktionsvorlage. Die muss erst vom Compiler zu einer Funktion konkretisiert werden, wenn der weiß, für welche Template-Parameter er das tun muss.

    Dementsprechend kannst du sie nicht aus einer DLL exportieren. Lass das __declspec-Gedöns weg, und pack die Definition der Funktionsvorlage mit in den Header, wo der Compiler sie finden kann, wenn er sie braucht.



  • soll ich die funktionsvorlage in eine headerdatei der dll oder in eine der konsolenanwendung packen?

    also zB so?:

    dllheader.h

    template<class T> void safe_cin(T&);
    

    dllmain.cpp:

    template<class T> void safe_cin(T&)
    {
    //code aus funktion
    }
    

    oder kann ich die gar nicht in die dll packen und muss sie in eine heraderdatei der Konsolenanwendung stecken?

    mfg,
    andi01.



  • Wo du die Headerdatei hinpackst, ist ziemlich gleichgültig, aber der Compiler muss die komplette Definition der Vorlage kennen, sonst kann er sie nicht konkretisieren. Das heißt

    // header.hh
    
    template<class T> void safe_cin(T&) {
      //code aus funktion
    }
    

    Was du da hast, ist noch keine Funktion, also kannst du es auch nicht als Symbol aus einer DLL exportieren. Du kannst, wenn dir das ausreicht, explizite Konkretisierungen aus der DLL exportieren, aber dann kannst du die Vorlage auch nur mit den Typen verwenden, für die du sie explizit konkretisiert hast. Das geht dann etwa so:

    // header.hh
    
    template<class T> void safe_cin(T&);
    
    template<class T> void safe_cin(T&) {
      // code
    }
    
    template void __declspec(dllexport) safe_cin(int&);
    template void __declspec(dllexport) safe_cin(double&);
    // ...
    

Anmelden zum Antworten