Verständnis-Problem von Policies
-
Ich versteh Policies noch nicht so richtig und probiere gerade etwas damit. Allerdings bin ich mir noch nichtmal sicher ob das wirklich Policies sind was ich da mache. Das hab ich versucht:
#include <iostream> #include "policy.hpp" int main() { Ausgabe<Toll> a; a.Zahl(); std::cout << std::endl; Ausgabe<Einfach> b; b.Zahl(); std::cout << std::endl; system("PAUSE"); }class Toll { public: void Zahl() { std::cout << "Tolle Zahl: 5"; } }; class Einfach { public: void Zahl() { std::cout << "5"; } }; template<class Policy> class Ausgabe { public: void Zahl() { Policy.Zahl(); } };Leider bekomm ich folgende Fehlermeldung:
19 C:\Dev-Cpp\policy.hpp expected primary-expression before '.' tokenUnd versteh sie nicht wirklich. Ich hoffe ihr könnte mir helfen.
mfg.
-
class Toll { public: void do_Zahl() { std::cout << "Tolle Zahl: 5"; } }; class Einfach { public: void do_Zahl() { std::cout << "5"; } }; template<class Policy> class Ausgabe:public Policy { public: void Zahl() { do_Zahl(); } };MfG Spacelord
-
Ahh! Danke! Hab ich sogar verstanden *freu*
mfg.
-
So, jetzt hab ich das ganze erweitert, und bin stecken geblieben. Die Policies sollen jetzt auch Template-Klassen sein:
template<class T> class Toll { public: void Zahl() { T asd = 5; std::cout << "Tolle Zahl: " << asd; } }; template<class T> class Einfach { public: void Zahl() { T asd = 5; std::cout << asd; } }; template<class T, template <T> class Policy> class Ausgabe : public Policy { public: void Zahl() { Policy::Zahl(); // Zeile 23 } };#include <iostream> #include "policy.hpp" int main() { Ausgabe<int, Toll> a; a.Zahl(); std::cout << std::endl; Ausgabe<int, Einfach> b; b.Zahl(); std::cout << std::endl; system("PAUSE"); }Folgender Fehler:
23 C:\Dev-Cpp\policy.hpp `template<T <anonymous> > class Policy' used without template parametersmfg.
-
Versuch mal das: Policy<T>::Zahl();
-
Cool-O-Meter |XXXX------| schrieb:
Versuch mal das: Policy<T>::Zahl();
Hab ich auch schonmal, dann kam:
23 C:\Dev-Cpp\policy.hpp type/value mismatch at argument 1 in template parameter list for `template<T <anonymous> > class Policy'Ich steig durch die Fehlermeldungen kaum noch durch.
mfg.
-
template<class T, template <class> class Policy> class Ausgabe : public Policy<T> { public: void Zahl() { Policy<T>::Zahl(); } };Edit: Dadurch dass du den Namen der Methode der Policiy Klassen durch den von Ausgabe überlagerst machst du dir nur selber das Leben schwer.Was spricht denn dagegen die Methode in Ausgabe anders zu nennen?
Oder, halt doch bei do_Zahl zu bleiben?MfG Spacelord
-
Danke nochmal für deine Hilfe!
Wenn ich das durch doZahl() ersetzte, bekomme ich folgenden fehler:
template<class T> class Toll { public: void doZahl() { T asd = 5; std::cout << "Tolle Zahl: " << asd; } }; template<class T> class Einfach { public: void doZahl() { T asd = 5; std::cout << asd; } }; template<class T, template <class> class Policy> class Ausgabe : public Policy<T> { public: void Zahl() { doZahl(); } };23 C:\Dev-Cpp\policy.hpp there are no arguments to `doZahl' that depend on a template parameter, so a declaration of `doZahl' must be availableDann hab ich noch eine Frage: Warum kommt da am Anfang ein class in die <> Klammern? Was bedeutet dass denn genau wenn man so ein Schlüsselwort als Templateargument übergibt??
mfg.
-
Mit VC++ 8 kompiliert der Code einwandfrei. gcc kotzt,macht aber auch gleich den Vorschlag mit -fpermissive zu kompilieren.Mit voller Qualifizierung läuft es auch ohne die zusätzliche Compileroption.
Zu deiner Frage:
Du könntest auch schreibentemplate<class T, template <class U> class Policy> class Ausgabe....Da du aber auf U innerhalb von Ausgabe ohnehin nicht zugreifen kannst,und es nur nen formales Argument zur Erzeugung von Policy ist kannst du es auch gleich weglassen.
MfG Spacelord
-
Spacelord schrieb:
Mit VC++ 8 kompiliert der Code einwandfrei. gcc kotzt,macht aber auch gleich den Vorschlag mit -fpermissive zu kompilieren.Mit voller Qualifizierung läuft es auch ohne die zusätzliche Compileroption.
Jo, das mit dem -fpermissive klappt, dann ist nur noch ne Wahrnung da. Ist das denn schlimm oder kann ich die ignorieren?
Zu deiner Frage:
Du könntest auch schreibentemplate<class T, template <class U> class Policy> class Ausgabe....Da du aber auf U innerhalb von Ausgabe ohnehin nicht zugreifen kannst,und es nur nen formales Argument zur Erzeugung von Policy ist kannst du es auch gleich weglassen.
MfG Spacelord
Cool, hab ich verstanden! Danke, danke...
mfg.