structur und classe mit template?
-
Hallo ich möchte einer variable in einer structur in einer classe den Datentyp über eine Template geben, wie mache ich das, ich habe leider nicht wirklich was gefunden was mir weiter hilft, hier ein beispiel:
class MeineClasse { struct MeineStructur { xxx MeineVariable; //Hier an xxx soll der Datentyp über die Template eingesetzt werden. }; };
-
Zuerst musst Du entscheiden was denn das Template sein soll: die innere oder die äußere Klasse.
-
Die innere, also ich möchte bei der Initialisierung die Template setzen:
MeineKlasse<int> myClass;
und "int" soll dann in der structur eingesetzt werden.Ahja und in ein paar Methoden der Klasse möchte ich die Template auch nutzen.
-
Hast Du Dir die Grundlagen zu Templates schonmal angeschaut? Ist nämlich nicht anders als wenn die Variable in der äußeren Struktur wäre.
template< class T > class MeineClasse { struct MeineStructur { T MeineVariable; }; };
-
irgendwie verstehe ich das nicht..
Das sieht jetzt so aus:
main.cpp#include <iostream> #include "MyList.h" int main() { MyList<int> list; list.Add(12); std::cout << list.Get() << std::endl; getchar(); return 0; }MyList.cpp
#include "MyList.h" template <class T> MyList<T>::MyList() { } template <class T> MyList<T>::~MyList() { } template <class T> void MyList<T>::Add(T data) { MyList::scruct.MeineVariable = data; } template<class T> T MyList<T>::Get() { return MyList::scruct.MeineVariable; }MyList.h
template< class T > class MyList { private: struct MeineStructur { T MeineVariable; }; MeineStructur scruct; public: MyList(); ~MyList(); void Add(T data); T Get(); };Wenn ich das nun Compiliere bekomme ich das:
Fehler 1 error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall MyList<int>::~MyList<int>(void)" (??1?$MyList@H@@QAE@XZ)". main.obj MeineListe Fehler 2 error LNK2001: Nicht aufgelöstes externes Symbol ""public: int __thiscall MyList<int>::Get(void)" (?Get@?$MyList@H@@QAEHXZ)". main.obj MeineListe Fehler 3 error LNK2001: Nicht aufgelöstes externes Symbol ""public: void __thiscall MyList<int>::Add(int)" (?Add@?$MyList@H@@QAEXH@Z)". main.obj MeineListe Fehler 4 error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall MyList<int>::MyList<int>(void)" (??0?$MyList@H@@QAE@XZ)". main.obj MeineListe Fehler 5 fatal error LNK1120: 4 nicht aufgelöste externe Verweise. D:\Dokumente\Visual Studio 2008\Projects\C++\MeineListe\Debug\MeineListe.exe MeineListe
-
Gaaaaaaaaanz anderes Problem:
siehe http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html zweiter Post.
-
hm oke, wenn ich alles in eine cpp Datei stecke dann geht es.
Aber sobald ich die Klasse unter die main() oder in eine andere cpp stecke läuft es nicht mehr...
ach ich has.. C++Also mit anderen Worten es geht nicht so wie ich das vor habe.. aber trotzdem danke.
-
Das liegt einfach daran das die Templates zur Compile-Zeit aufgedröselt werden, also konkrete Klassen je nach Nutzung draus werden. Wenn du nun Teile in cpp-Dateien packst, findest du diese mit einem Include nicht. Und beim Linken, wo der Part der anderen Objektdateien zur Verfügung steht, ist es schon zu spät. Die konkreten Klassen und deren Funktionen müssen vorher bekannt sein.
Daher entweder alles in den Template-Header oder die .cpp Datei in .tmpl oder sowas umbennen und auch inkludieren. Letzteres ist wohl am ordentlichsten.
-
lord_fritte schrieb:
hm oke, wenn ich alles in eine cpp Datei stecke dann geht es.
[...]
Also mit anderen Worten es geht nicht so wie ich das vor habe.. aber trotzdem danke.Grmpf... Steht in dem FAQ-Beitrag nicht
HumeSikkins schrieb:
wird dir nichts anderes übrigbleiben als die Definitionen in den Header zu schreiben.
? :p
-
Aber wie sollen die Definitionen der Klasse aussehen?
-
lord_fritte schrieb:
Aber wie sollen die Definitionen der Klasse aussehen?
Entweder alles aus MyList.cpp in MyList.h rein.
Oder MyList.cpp in MyList.tmpl umbenennen und die ebenfalls in main.cpp inkludieren.
-
Ah es funktioniert, danke.
Aber seit wann geht so was? Unter C konnte man doch nur die reine Definition in die h Datei schreiben.
Aber kann es sein das so das IntelliSense nicht mehr funktioniert? ich bekomme keine Einzige Methode oder variable mehr aus der Klasse angezeigt..
Visual Studio sagt mir nur: IntelliSense: 'Der Typ des Ausdrucks links von . Oder -> ist keine Klasse, Structor oder Union'ABer naja das IntelliSense von Visual C++ war ja auch noch nie wirklich gut.
-
ABer naja das IntelliSense von Visual C++ war ja auch noch nie wirklich gut.
Dann schalt sie doch aus.
-
hmm dann hab ich garkeine mehr.. auch schei.. gibt es keine alternative die man installieren kann?
-
lord_fritte schrieb:
hmm dann hab ich garkeine mehr.. auch schei.. gibt es keine alternative die man installieren kann?
Visual Assist X
Bin sehr zufrieden damit, kostet allerdings etwas.Grüssli
-
lord_fritte schrieb:
Aber kann es sein das so das IntelliSense nicht mehr funktioniert?
Sollte eigentlich nicht passieren, bzw. es liegt nicht am Template. Manchmal hat die IntelliSense-Datenbank ein Problem, da hilft entweder Neu-Erstellen der Projektmappe oder Löschen der Datenbankdatei (*.ncb).
-
Dravere schrieb:
lord_fritte schrieb:
hmm dann hab ich garkeine mehr.. auch schei.. gibt es keine alternative die man installieren kann?
Visual Assist X
Bin sehr zufrieden damit, kostet allerdings etwas.Grüssli
Naja gibt es nicht was was wirklich nur das IntelliSense von C++ verändert und C# läßt wie es ist?
-
Was gefällt dir denn am IntelliSense-System in C++ nicht? Klar, die Ausfälle ab und zu sind halt lästig, aber für mich ist IntelliSense wirklich eine sehr grosse Hilfe...
-
Nexus schrieb:
Was gefällt dir denn am IntelliSense-System in C++ nicht? Klar, die Ausfälle ab und zu sind halt lästig, aber für mich ist IntelliSense wirklich eine sehr grosse Hilfe...
Bei mir fällt es andauert aus..
Also ich kann mich nicht erinnern dass es bei jemals bei C++ funktioniert hat,
unter C# ist das IntelliSense echt super.
Aber unter C++ kannste es total vergessen.
Und jetzt bekomme ich bei meiner Klasse auch nur noch die Meldung "IntelliSense: 'Keine weiteren Informationen verfügbar.'". Egal ob ich innerhalb der Klasse Arbeite oder außerhalb.
-
Nexus schrieb:
Sollte eigentlich nicht passieren, bzw. es liegt nicht am Template. Manchmal hat die IntelliSense-Datenbank ein Problem, da hilft entweder Neu-Erstellen der Projektmappe oder Löschen der Datenbankdatei (*.ncb).
Nicht zwagsweise, es gibt durchaus Konstrukte ohne Templates wo Intellisense aufgibt. Zum Beispiel scheint es nur den Header zu analysieren, beim Handle-Body Idiom (PIMPL) steigt es aber bereits in den einfachsten Fällen aus. Und es gibt noch weit mehr Situationen wenn man sich mit den etwas spezielleren C++ Konstrukten beschäftigt...
Wobei ich sagen muss nachdem ich inzwischen nun wieder mit den C++ Builder arbeite, sehne ich mit sogar das ganz klassische Intellisense und einfachste Refactoringwerkzeuge zurück. Das CodeInsign gibt bei mir relativ schnell den Geist auf (oder ist extremst langsam).
cu André
-
Aber ich frage mich, warum ist der C# Compier so gut Entwickelt und der C++ Compiler nicht?
Hat Microsoft keine Lust mehr den C++ Compiler zu entwickeln/erweitern?