Astasor Geschrieben 3. September 2013 Geschrieben 3. September 2013 (bearbeitet) Hallöchen, ich habe eine dll mit verschiedenen Template-Funktionen geschrieben. Eine solche Funktion sehen sie hier: #ifndef _SELECT_H_ #define _SELECT_H_ #include "./../common.h" #include <vector> template <typename T1> __declspec(dllexport) inline bool SimpleSelect(std::vector<T1>& values,int& i,int left,int right){ int pivot=0; if(i>right+1){i=0;return false;} if(left==right){i=values.at(left); return true;} else{ pivot=left; order<T1>(values,pivot,left,right); if(i==(pivot-left)){i=values.at(pivot); return true;} else{ if(i<(pivot-left)){SimpleSelect<T1>(values,i,left,right-1); return true;} else{ i=i-1; SimpleSelect<T1>(values,i,left+1,right); return true; } } } } #endif [/PHP] Doch dummerweise wird die Funktion SimpleSelect nicht exportiert. Ich habe in anderen Foren gelesen, das man Template-Funktionen für jeden Datentyp, der exportiert werden soll, explizit spezifizieren muss, aber das würde doch irgendwo dem Sinn von Templates zuwider laufen, oder? Was mache ich hier falsch? Ein Stichwort oder ein Hinweis wären toll. Ich will nicht das hier jemand die Arbeit für mich macht. Zur Vollständigkeit halber. [PHP] //in common.h template <typename T1> inline bool order(std::vector<T1>& values,int& pivot,int left,int right){ int tmpleft=left; int tmpright=right; bool finish=false; if((left>pivot)||(right<pivot)){return false;} while(finish==false){ finish=true; if(tmpleft<=pivot){ if(values.at(tmpleft)<=values.at(pivot)){tmpleft=tmpleft+1;} else{ flip<T1>(values.at(tmpleft),values.at(pivot)); pivot=tmpleft; } finish=false; } if(tmpright>=pivot){ if(values.at(tmpright)>=values.at(pivot)){tmpright=tmpright-1;} else{ flip<T1>(values.at(tmpright),values.at(pivot)); pivot=tmpright; } finish=false; } } return true; } Die Select.h habe ich in die dllmain.cpp mit inkludiert, also wird sie auch mit zusammengelinkt. Die dll wird vom Compiler auch erstellt, aber halt die Template-Funktion SimpleSelect nicht exportiert. Bitte gebt mir nen Tipp. Vielen Dank mfg Astasor Bearbeitet 3. September 2013 von Astasor Zitieren
Klotzkopp Geschrieben 3. September 2013 Geschrieben 3. September 2013 Ein Funktionstemplate ist keine Funktion, sondern eine Vorlage für Funktionen. Du kannst nur Funktionen exportieren, keine Templates. Ein Funktionstemplate muss dort, wo es instanziiert wird, vollständig definiert sein. Das geschieht zur Compilezeit. Du kannst ein Template nicht zur Laufzeit aus einer DLL laden, es sei denn, es ist dort schon zur Compilezeit (der DLL) angelegt worden. Zitieren
Astasor Geschrieben 4. September 2013 Autor Geschrieben 4. September 2013 Ich nutze jetzt die Lösung, die ich in anderen Foren schon gesehen habe. Ich definiere Funktionen mit konkreten Datentypen, die dann, in ihrer Implementation, mit ihrem jeweiligen Datentyp das entsprechende Template aufrufen. So kann ich die erstellten Templates sinnvoll nutzen und die Funktionen selbst exportieren. Wie immer Danke für deine Hilfe, Klotzi mfg Astasor Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.