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

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

1

20.05.2006, 08:56

Linker error wenn template-funktionen nicht inline?

Ich hatte in meinem Projekt eineige Templatefunktionen, die zuerst nicht inline waren.
Als ich mein Projekt dann kompilirte, bekam ich ständig LNK2005 (mehrfachdefinierte Symbole).

Im MSDN-Forum las ich dann, dass man in einem solchen fall die Funktion als Inlinefunktion definieren soll.
Das hat nun auch funktioniert, mir ist aber gänzlich unklar warum das so sein muss.

Könnte mir das vielleicht einer erklären?

mfg Philipp

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

25.05.2006, 12:00

Hi,

kannst du mal ein kleines Beispiel zum besten geben? Immer wenn mir sowas passiert, habe ich bei den Templates was falsch gemacht.

Gruss,
Rainer

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

3

25.05.2006, 14:09

ich hatte folgendes:

Erzeuge Linker-Errors:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
template <typename _type> _type fsin(_type value)
  {
    return 0;
  }
  template<> float fsin(float f)
  {
    return sinf(f);
  }
  template<> double fsin(double d)
  {
    return static_cast<double>(sinf(d));
  }


Keine Linker-Errors:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
template <typename _type> inline _type fsin(_type value)
  {
    return 0;
  }
  template<> inline float fsin(float f)
  {
    return sinf(f);
  }
  template<> inline double fsin(double d)
  {
    return static_cast<double>(sinf(d));
  }

mfg Philipp

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

4

25.05.2006, 14:52

Aha, du hast eine Template-Funktion und zwei Funktionen, die das Template Argument schon fest binden.

Letztere müssen inline sein, weil sie zwar noch auf das Template passen, aber eben nicht mehr wirklich template Funktionen sind. Mir fällt eben nicht ein, wie das Fachwort dazu heisst. ;)

C-/C++-Quelltext

1
fsin<long double> (pi)


Die Zeile oben würde auch in der ersten Version keinen Link Error geben, weil der Compiler on the fly den Code generiert, wo er gebraucht wird und das auch für den Linker markiert, wenn das ganze nicht automatisch inline expandiert ist. Der Linker meckert dann einfach nicht mehr rum, wenn ein Symbol doppelt auftaucht. Wenn man die Template-Argument fest bindet gibt es aber nur noch eine Implementation und die muss dann eben eindeutig (oder inline) sein.

Gruss,
Rainer

Werbeanzeige