Template-Klasse: "wrong number of template arguments (0, should be 1)"



  • Hey Leute,
    ich bastle gerade an einer Template-Klasse die als Container für
    verschiedene Objekte dienen soll (ähnlich den Container in der STL).
    Ich habe jedoch noch nicht allzuviel Erfahrung im Umgang mit Template-Klassen.
    Daher hab ich keinen blassen Schimmer was ich falsch mache:
    Hier meine Klasse (ich hab sie fürs Forum stark vereinfacht)

    //group_figure.h
    #include "basic_figure.h"
    
    template<class figure> class group_figure : basic_figure {
    
       public:
          group_figure();
          group_figure(int);
          ~group_figure();
    
       private:
          figure **members;
          bool *state;
          int number;
    
    };
    
    template<class figure> group_figure<figure>::group_figure() {
    
       OUTPUT("Group_figure-Default-Konstructor called, invalid")
       error = true;
    
    }
    
    template<class figure> group_figure<figure>::group_figure(int tnumber) {
    
       OUTPUT("Group_figure-Konstructor called")
    
       number = tnumber;
       members = new (figure*)[number];
       state = new bool[number];
       for(int x = 0; x < number; ++x) {
          members[x] = (figure*) new figure;
          state[x] = true;
       }
    }
    
    template<class figure> group_figure<figure>::~group_figure() {
    
       OUTPUT("Group_figure-Destructor called")
    
       for(int x = 0; x < number; ++x)
             delete members[x];
       delete [] members;
       delete [] state;
    
    }
    

    Und nun die dazugehörigen Fehlermeldungen:

    In file included from /usr/local/include/figure.h:14,
                     from code/pong.cpp:6:
    /usr/local/include/FIGURE/group_figure.h:39: error: wrong number of template
       arguments (0, should be 1)
    /usr/local/include/FIGURE/group_figure.h:11: error: provided for `
       template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:39: error: declaration of template `
       template<class> int group_figure()'
    /usr/local/include/FIGURE/group_figure.h:11: error: conflicts with previous
       declaration `template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:11: error: previous non-function
       declaration `template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:39: error: conflicts with function
       declaration `template<class> int group_figure()'
    /usr/local/include/FIGURE/group_figure.h:47: error: wrong number of template
       arguments (0, should be 1)
    /usr/local/include/FIGURE/group_figure.h:11: error: provided for `
       template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:47: error: declaration of template `
       template<class> int group_figure(int)'
    /usr/local/include/FIGURE/group_figure.h:11: error: conflicts with previous
       declaration `template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:11: error: previous non-function
       declaration `template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:47: error: conflicts with function
       declaration `template<class> int group_figure(int)'
    /usr/local/include/FIGURE/group_figure.h: In function `int group_figure(int)':
    /usr/local/include/FIGURE/group_figure.h:52: error: Syntaxfehler before `)'
       token
    /usr/local/include/FIGURE/group_figure.h:55: error: Syntaxfehler before `)'
       token
    /usr/local/include/FIGURE/group_figure.h: At global scope:
    /usr/local/include/FIGURE/group_figure.h:60: error: wrong number of template
       arguments (0, should be 1)
    /usr/local/include/FIGURE/group_figure.h:11: error: provided for `
       template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:60: error: destructors must be member
       functions
    /usr/local/include/FIGURE/group_figure.h:60: error: declaration of template `
       template<class> void group_figure()'
    /usr/local/include/FIGURE/group_figure.h:11: error: conflicts with previous
       declaration `template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:11: error: previous non-function
       declaration `template<class> class group_figure'
    /usr/local/include/FIGURE/group_figure.h:60: error: conflicts with function
       declaration `template<class> void group_figure()'
    

    Ich nehme mal an es ist ein ganz trivialer Fehler, wäre für aufklärung dankbar :). Schonmal Danke an alle die sich die Mühe gemacht haben das alles zu lesen.

    PS:

    /usr/local/include/FIGURE/group_figure.h:52: error: Syntaxfehler before `)'
       token
    /usr/local/include/FIGURE/group_figure.h:55: error: Syntaxfehler before `)'
       token
    

    Diese beiden Zeilen interpretier ich so das ich keine Pointer auf meine
    Templates benutzten darf, wie ich es hier mache
    Z:52 "members = new (figure*)[number];"
    Weis vll. auch hier jemand Rat?



  • Hallo,

    folgender Quellcode kompiliert bei mir (g++ 3.3.6) problemlos, Änderungen sind dokumentiert:

    #include <iostream>
    
    /**
      Da du basic_figure nicht angegeben hast, hab ich halt mal n simples struct gewählt, wenn es auch ein Template ist, musst du das 
      auch beim Ableiten angeben: group_figure : basic_figure<figure> 
    */
    struct basic_figure { 
      bool error;
    };
    
    template<class figure> 
    class group_figure : basic_figure { 
      figure **members; 
      bool *state;
      int number; 
    
    public: 
      group_figure(); 
      group_figure(int); 
      ~group_figure(); 
    
    }; 
    
    template<class figure> 
    group_figure<figure>::group_figure() { 
      std::cout<<"Group_figure-Default-Konstructor called, invalid\n";
      members = 0;  //Ich setzte die Zeiger mal auf 0, da du sie später löschen willst. Wenn man das hier nicht tut, gibt's n SegFault
      state = 0;
      error = true;
    } 
    
    template<class figure> 
    group_figure<figure>::group_figure(int tnumber) {  
      std::cout<<"Group_figure-Konstructor called\n";
    
      members = 0;  //Gleiches Spiel...
      state = 0;
    
      number = tnumber; 
      members = new (figure*)[number]; 
      state = new bool[number]; 
      for(int x = 0; x < number; ++x) { 
        members[x] = (figure*) new figure; 
        state[x] = true; 
      } 
    } 
    
    template<class figure> 
    group_figure<figure>::~group_figure() {  
      std::cout<<"Group_figure-Destructor called\n";
    
      if (members != 0 && state != 0) {  //Hier ne Abfrage ob null
    
        for(int x = 0; x < number; ++x) 
          delete members[x]; 
        delete [] members; 
        delete [] state; 
      }
    }
    
    int main() {
      group_figure<int> gf(7);
      return 0;
    };
    

    So what? Hast du den wichtigen Tiel vom Source unterschlagen 😉 ?

    EDIT: Kommentar nicht zugemacht

    MfG

    GPC



  • Hab den Fehler! 2 Stunden Arbeit und dann hab ich folgende Zeile in einem meiner Header gefunden

    #ifndef figure
    #define figure
    ...
    #endif
    

    und das in Verbindung mit

    template<class figure>
    

    Das Leben kann so grausam sein!



  • Storm.Xapek.de schrieb:

    Hab den Fehler! 2 Stunden Arbeit und dann hab ich folgende Zeile in einem meiner Header gefunden

    #ifndef figure
    #define figure
    ...
    #endif
    

    und das in Verbindung mit

    template<class figure>
    

    Das Leben kann so grausam sein!

    deswegen sehen meine Include - Guards so aus:

    #ifndef GUARD_SUBDIR_DATEINAME_ENDUNG_INCLUDED
    #define GUARD_SUBDIR_DATEINAME_ENDUNG_INCLUDED
    #endif //GUARD_SUBDIR_DATEINAME_ENDUNG_INCLUDED
    

    oder an einem Beispiel:
    Headerdatei: "objects/figure.h"

    #ifndef GUARD_OBJECTS_FIGURE_H_INCLUDED
    #define GUARD_OBJECTS_FIGURE_H_INCLUDED
    
    #endif //GUARD_OBJECTS_FIGURE_H_INCLUDED
    

    Und weil ich ja faul bin, verwende ich, wenn ich nur mit dem VC++ arbeite einfach nur

    #pragma once
    

    :p

    BR
    Vinzenz



  • Also im Verstand halten, dass deine class Kopie Konstrukteur werkzeug oder verbieten musst.
    Weil es ist nicht ungewöhnlich Engpaß, benutzest std::vector anstatt Massive.



  • RoboTact schrieb:

    Also im Verstand halten, dass deine class Kopie Konstrukteur werkzeug oder verbieten musst.
    Weil es ist nicht ungewöhnlich Engpaß, benutzest std::vector anstatt Massive.

    Sorry aber das hab ich jetzt überhaupt nicht verstanden. Das sieht irgendwie total nach Online-Translator ausgabe aus Oo

    BR
    Vinzenz



  • RoboTact: According to your profile, you are from Moskow. You might write in English, I think it's better to understand than your German (this is not meant to be offending).



  • Michael E. schrieb:

    RoboTact: According to your profile, you are from Moskow. You might write in English, I think it's better to understand than your German (this is not meant to be offending).

    Sorry, didn't realize it's THAT bad. Is english generally known by participants of forum, that is would it be OK to answer in english? All messages I saw were in German with few admixed engish words.

    Translation of what I previously said:
    Keep in mind that you must either implement copy constructor, or prohibit one.
    When it doesn't somehow create bottleneck situation, use std::vector instead of arrays (even vector<vector<smth> >).



  • RoboTact schrieb:

    Is english generally known by participants of forum, that is would it be OK to answer in english?

    IMHO yes. But you understand German, don't you? Maybe you write a little hint in your signature that you do so if you do so 😉


Anmelden zum Antworten