Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

template Funktion aus DLL exportieren

Empfohlene Antworten

Veröffentlicht

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

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.

  • Autor

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.