Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

1

20.02.2006, 21:39

templates in einder Dll... gibts nicht

.... Ok. Nachdem ich jetzt schon mehrere Nächte und auch Tage sitze.., vor diesem dummen Compiler, ...den dummen templates und der dummen Dll... :crying: . Hab ich gemerkt, das man templates ja gar nicht in Dlls so richtig rein machen kann. Grund dafür ist das man die DLL ja compiliert, und wenn man keine fertigen Schablonen hat, der Compiler ja folglich auch nichts finden kann.

Jetzt hab ich schon gelesen das man eben Schablonen definieren sollte, mit int etc. Das wiederspricht ja aber dem template Konzept an sich.... hat da jemand eine elegante Lösung. Besser wäre es wohl dann nur den template Kram in eine statische lib und den Rest in eine Dll zu packen.... was für ein durcheinander ... es lebe define (nicht ernst nehmen) :crying:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

20.02.2006, 21:44

Re: templates in einder Dll... gibts nicht

Templates musst Du schon in eine "öffentliche" Header-Datei packen. Es gibt keine Möglichkeit, sie in eine DLL oder statische Library zu tun. Der Compiler muss die Template-Definition schließlich kennen, um seine Klassen daraus generieren zu können.

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

3

20.02.2006, 21:45

stimmt... eine statische geht ja auch nicht.... wer hat sich das nur ausgedacht.... ich meine logisch ist es ja, es stört aber trotzdem.

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

20.02.2006, 23:17

Was genau willste denn machen?

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

21.02.2006, 08:36

na einfach templates in eine DLL packen, und dann in der Anwendung laden. Da ich aber dann schreibe: Stack<int>(32) und er int nicht als Vorlage kennt (template) findet er es nicht. Die einzige Lösung ist wohl Stack<int> mit in der DLL zu definieren, aber dann brauch ich ja auch keine templates...

Anonymous

unregistriert

6

21.02.2006, 08:50

Du musst doch sowieso das Headerfile includen wenn du die Funktionen
in einer DLL verwenden möchtest. Da Templates immer in Header-Files
definiert werden kannst du das dann doch auch in das Header-File der DLL
packen. Dann hast du das Template sowohl in der DLL, als auch in dem
Programm das die DLL verwendet.

Dir muss aber klar sein, dass in der DLL kein Template drin ist... wenn du
z.B. dieses Template hast:

C-/C++-Quelltext

1
2
3
4
5
template class <class T> Array
{
  public:
    T* liste;
}


und in der DLL das so verwendest:

C-/C++-Quelltext

1
Array<float>   myArray;


Dann ist in der DLL nicht das Template selbst, sondern folgendes enthalten:

C-/C++-Quelltext

1
2
3
4
5
class Array<float>
{
  public:
    float* list;
};


D.h. das Template ist nun fest auf float gemünzt - man kann quasi
sagen das Template wurde "instantiiert" oder auch "konkretisiert".

So ist es aber bei allen Programmen die Templates verwenden - darum
heißen sie auch so. Es wird das Template genommen, ensprechend dem
gewünschten Typen angepasst und verwendet. Es ist eigentlich nur eine
Ersparnis an Tiparbeit - hat aber auch andere Vorteile.

Grüße
Stefan

koschka

Community-Fossil

  • »koschka« ist der Autor dieses Themas

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

21.02.2006, 21:03

nein, es geht eben nicht, weil wenn du eine DLL compilierst, liegt alles in maschienencode vor. Da gibts dann keine Schablonen mehr, ausser du hast direkt welche definiert. da du ja bei templates nicht direkt sagst, mit was für Typen gearbeitet wird kann er den Einstiegspunkt folglich auch nicht finden. Er scheisst also eine Linker Fehlung.

Das einzige was man machen kann ist eben Schablonen definieren wie.

Das das nicht geht ist mir klar... aber vielleicht gaibts ja noch einen Weg ausser direkt zu sagen welche Werte die Klasse nur annehmen kann. Bis jetzt hab ich aber auch nur Schablonen im Netz gesehen wo direkt gesagt wurde.... "das Template kann nur int und char aufnehmen". Es wird also wohl nicht gehen. Schade :(

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

21.02.2006, 22:46

Du könntest es doch so machen wir schon in dem anderen Thread angesprochen wurde.. Einfach ein Objekt vorgeben, von dem der Benutzer dann ableiten muss und es an deine Klasse (die du mit Templates machen wolltest) übergibt.

Also anstatt

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template <class T>
class foo
{
private:
    T* Obj;
public:
    foo() {Obj = new T;}
}

machste

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class IBase
{
}

class foo
{
private:
    IBase* Obj;
public:
    foo(IBase* Src) {Obj = Src;}
}

Werbeanzeige