Zum Inhalt springen

template Funktion aus DLL exportieren


Astasor

Empfohlene Beiträge

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 von Astasor
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...