Problem mit Template-Klasse



  • Hallo,
    ich versuche eine Klasse Becher als Template zu programmieren

    Was 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::.


Anmelden zum Antworten