Problem mit Template-Klasse
-
Hallo,
ich versuche eine Klasse Becher als Template zu programmierenWas bedeutet die Fehlermeldung des Compilers:
C2955 "Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich."Ich verwende Visual C++ 2008 Express
Es ist eine Konsolenanwendung///////////////////// Becher.h ///////////////////////////// #pragma once #include <string> #include <iostream> template<typename Typ> class Becher { private: std::string inhalt; Typ fassungsvermoegen; float fuellhoehe; public: typedef float AbsWertTyp; Becher(std::string i, Typ fa, float fu); //Konstruktor void ausgabe() const {std::cout << "in Klasse Becher!";} bool reichtKapazitaet(int) const; bool reichtKapazitaet(const Becher* b) const; static AbsWertTyp berechneAbsolutwert(float gw, float ps); int getFuellmenge(); std::string getInhalt() const { return(inhalt); } }; ////// Becher.cpp ////////////////////////////////////////// #include "StdAfx.h" #include "Becher.h" #include <iostream> using namespace std; /////// An dieser Stelle bringt der Compiler folgenden Fehler: ////// C2955 "Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich." Becher::Becher(string i, Typ fa, float fu) : inhalt(i), fassungsvermoegen(fa), fuellhoehe(fu) { if(fa<0) throw string("Negatives Fassungsvermoegen"); if(fu<0) throw string("Negative Fuellmenge"); if(fu>100) throw fu; } bool Becher::reichtKapazitaet(int ml) const { float platz = berechneAbsolutwert( static_cast<float>(fassungsvermoegen), 100-fuellhoehe); return(platz >= ml); } bool Becher::reichtKapazitaet(const Becher* b) const { if(inhalt!=b->inhalt) return(false); return(reichtKapazitaet( static_cast<int>(berechneAbsolutwert( static_cast<float>(b->fassungsvermoegen), b->fuellhoehe)))); } Becher::AbsWertTyp Becher::berechneAbsolutwert(float gw, float ps) { return(static_cast<AbsWertTyp>(gw*ps/100.0F)); } int Becher::getFuellmenge() { return(static_cast<int>(fassungsvermoegen*fuellhoehe/100.0F)); } ////////// Main.cpp /////////////////////////////////////// #include "stdafx.h" #include <iostream> #include "Becher.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { Becher<int> b("Milch", 500, 50); b.ausgabe(); return 0; }Wer kann mir weiterhelfen?
-
Du musst Template-Klassen dort definieren, wo du sie auch deklarierst (in deinem Fall im Header "Becher.h").
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Die eigentliche Fehlermeldung besagt, daß du vor jede Definition der Funktion noch
template<typename Typ>schreiben mußt (sofern du sie außerhalb der Klassendefinition schreibst).
Aber wichtig ist auch der Hinweis von Mr.Long.
-
Th69 schrieb:
Die eigentliche Fehlermeldung besagt, daß du vor [u]jede[(u] Definition der Funktion noch
template<typename Typ>schreiben mußt (sofern du sie außerhalb der Klassendefinition schreibst).
Und außerdem dann noch Becher<Typ>:: anstatt Becher::.