Sind Template Methoden auch automatisch inline ?

zarilla

Mitglied
Irgendwo hab ich mal gelesen das Methoden die direkt in der Klassendefinition definiert werden automatisch inline sind.
Trifft das bei Templates auch zu ?
 
Im Fall vom Visual C++ Compiler bin ich mir so ziemlich sicher, dass das auch bei Templates so ist.
Ein übersichtliches Programmieren erfordert an Sich schon ein separates Header-File, dann kann man die Methoden inline machen, die dafür geschaffen sind.
Die Sache ist aber, dass sowas wirklich vom Compiler und auch von gesetzten Compiler-Flags, wie man es beim gcc bzw g++ macht, abhängt
 
Und Templateklassen können auch genau wie "normale" Klasse deklariert werdern ?
dh Klasse in .h und Methodendefinition in .cpp ?
 
Natürlich, wie willst du sie sonst deklarieren?

Bedenke nur, das man von Template klassen keine library oder DLL anlegen kann, ohne die klassen explizit für alle datentypen zu instanzieren für die man sie benutzen will.

grundsätzlich sieht das so aus:

headerdatei:
Code:
template <class T> class MyTemplateClass : public AnotherClass {
   public:
      T* getObject();
      //...
};
cpp datei:
Code:
template<class T> T* MyTemplateClass::getObject() {
   return new T();
}

Das sich diese klasse hier absolut nix bringt, is klar, aber das soll ja nur n beispiel sein
 
Bist Du sicher, dass Templates in eine Cpp-Datei gehören? AFAIK gehören sie entweder direkt in den Header oder aber in eine Datei, die in den Header per #include "..." eingebunden wird.

Der Grund ist folgender: "When writing template classes, function definitions are usually stored in a header file along with their declarations, and not in a separate .cpp file. Trying to do otherwise typically will result in a linker error. This is because most compilers require template definitions to be available to each translation unit that uses them, through the inclusion of header files." (http://www.codeguru.com/atl/KD062002.html - Stand 22.01.04)

Ich weiß jetzt aber nicht, ob es schon weit verbreitete Compiler bzw. Linker (z.B. GCC) gibt, die das nicht mehr brauchen.

MfG

Tobias
 
also ich habe es in Dev-C++ (GCC) folgendermaßen probiert:
MyTemplateClass.h:
Code:
template <class T> class MyTemplateClass {
   public:
      MyTemplateClass(void);
      T* getObject();
      int size(void);
      //...
};
myTemplateClass.cpp:
Code:
#include "MyTemplateClass.h"

template<class T> T* MyTemplateClass::getObject() {
   return new T();
}
template<class T> MyTemplateClass::MyTemplateClass(void)
{
    cout<<"HELLO"<<endl;
}
template<class T> int MyTemplateClass::size(void)
{
    cout<<"Grösse: "<<sizeof(T)<<endl;
    return 0;
}
main.cpp:

Code:
#include <iostream>
#include <stdlib.h>
#include "MyTemplateClass.h"
using namespace std;

int main(void)
{
  MyTemplateClass<int> ttest();
  ttest.size(); 
  system("Pause");
  return 0; 
}

und es funktioniert irgendwie nicht...
16 main.cpp request for member `size' in `ttest()', which is of non-aggregate
Das Template std::Vector ist auch in der header-datei definiert.
Aber ich zweifle irgendwie daran das alle Templatemethoden inline sein sollen !?
 
Zuletzt bearbeitet:
Original geschrieben von Tobiasm
Bist Du sicher, dass Templates in eine Cpp-Datei gehören? AFAIK gehören sie entweder direkt in den Header oder aber in eine Datei, die in den Header per #include "..." eingebunden wird.

Der Grund ist folgender: "When writing template classes, function definitions are usually stored in a header file along with their declarations, and not in a separate .cpp file. Trying to do otherwise typically will result in a linker error. This is because most compilers require template definitions to be available to each translation unit that uses them, through the inclusion of header files." (http://www.codeguru.com/atl/KD062002.html - Stand 22.01.04)

Ich weiß jetzt aber nicht, ob es schon weit verbreitete Compiler bzw. Linker (z.B. GCC) gibt, die das nicht mehr brauchen.

MfG

Tobias

Also ich hab selbst schon Template klassen geschrieben und die funktionen in cpp dateien gepackt, funktioniert anstandslos...
Ich benutze VC++ 6.0 als Compiler.

Linkerfehler hatte ich erst als ich versucht hab die Template klasse in eine LIB zu packen, denn dann musste ich zuerst die klasse in der lib explizit instanzieren für jeden zu verwendenden datentyp.
 
@chibisuke: Also, ich habe mit meinem VC++.NET ausprobiert die Definition der Funktionen in eine cpp-Datei auszulagern und nur die Definition der Klasse im Header zu lassen. Daraufhin habe ich die Fehlermeldung von dem Linker erhalten, dass die Funktionen, die ich ausgelagert hatte, nicht aufgelöst werden konnten. Außerdem kann ich mir schwer vorstellen, dass sich der VC++ 6 Compiler da wesentlich anders verhält. Hast Du vielleicht die CPP-Datei vielleicht in die Header-Datei eingebunden oder hast Du explizite Template-Instanzierung genutzt ?

@zarilla: Hast Du mal

Code:
 template<class T> T* MyTemplateClass<T>::getObject()

probiert. Vermutlich fehlt nur das <T> hinter MyTemplateClass.

MfG

Tobias
 
Zurück