Problem mit Variablendeklaration



  • Aus der NNLib habe ich folgende Zeilen:

    class Node {
    // blubb
    }
    
    //...
    
    template <class LINK, class NODE,class INSERTER> std::istream& readLinks(std::istream &i,INSERTER ins,const std::map<std::string,NODE*> &where) {
      LINK *l;NODE *from,*to;std::string s,t;
    
      std::map<std::string, NODE* >::const_iterator f; // <- Problema
    
    //... usw
    }
    

    Beim Versuch das Ganze mit g++ zu compilieren gibt's dazu die Meldung

    src/NNLib-0.1/graph.h:234: error: expected ';' before 'f'

    Wo koennte hier das Problem liegen?
    Schreibe ich spasseshalber int statt NODE*, gibt es zwar keine Fehler, kann aber nicht Sinn der Sache sein.
    Setze ich vor das f ein ";", gibt es auch keine neuen Fehler, ausser dass f dann natuerlich nicht mehr definiert ist.

    Verwendet wird g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5



  • Wenn ein Member-Typ (hier const_iterator ) von Template-Parametern (hier NODE ) abhängt, musst du das Schlüsselwort typename verwenden:

    typename std::map<std::string, NODE* >::const_iterator f;
    

    Das erklärt auch, warum es mit int geht.



  • Jo, das scheint's gewesen zu sein.
    Man, dieser ganze Frickel-Code hier steckt wirklich voller Tuecken. 😑
    Aber gut zu wissen. Danke. Wenn ich dieses Projekt ueberstanden habe, brauche ich wenigstens anschliessend ein C++-Buch hoffentlich nur noch als Referenz. 😃



  • Zu frueh gefreut: Noch so'n Ding. Hat wahrscheinlich was mit der Sache zu tun und kommt aus der selben Lib...

    Diesmal bekomme ich folgendes:

    error: too few template-parameter-lists

    und hier der Code dazu:

    void NeuralNet::setInput(const std::vector<double> &inV) throw (length_error) {
    
      if (inV.size() != VI.size()) throw length_error("inputsize");
    // so geht's:
    //vector<InputTerminal*>::const_iterator i=VI.begin();
    //vector<double>::const_iterator v=inV.begin();
    
    // wenn ich aber hier deklariere, geht's nicht:
      for (vector<InputTerminal*>::const_iterator i=VI.begin(),
           vector<double>::const_iterator v=inV.begin(); // <- in der Zeile gibt's den Fehler
           i != VI.end();
           i++, v++) {
        (*i)->set(*v);
      }
    };
    

    Was laeuft diesmal falsch? 🙄



  • Das funktioniert genausowenig wie

    int i=2, double j=5;
    

    Was funktioniert ist so etwas:

    int i=2, j=5;
    

    und so etwas:

    int i=2, *j=0;
    

    Es darf nur ein Typ-Spezifizierer auftauchen und ein oder mehrere Deklaratoren.

    int i=2, *j=0;
    ^^^ ^    ^^
    TS  D1   D2
    
    TS     = Typ-Spezifizierer
    D1, D2 = Deklaratoren
    


  • Du kannst in einer for-Schleife nicht zwei verschiedene Variablentypen deklarieren, d.h.

    for(int x, double y; ;)
    

    würde genauso zu einem Fehler führen (das solltest du aber wissen ;-).
    Also mindestens eine Variable vor der Schleife daklarieren.

    Und dein geposteter Code steht original so in der NNLib? Welcher Compiler schluckt das denn (als Erweiterung)?



  • Ok, danke. 🙂

    Ne, ich habe keinen Peil von C++. 😃 Musste mich (zum Glueck) bisher nicht naeher damit befassen. 🙄

    Ich bin davon ausgegangen, man kann mit Komma statt Semikolon getrennt quasi Beliebiges in dieses for-Dingsi reinpacken...

    Also original steht die Deklaration auch davor. Aber anders. Die Zuweisungen stehen dafuer noch in der for-Schleife. So:

    void NeuralNet::setInput(const std::vector<double> &inV) throw (length_error) {
    
      if (inV.size() != VI.size()) throw length_error("inputsize");
      InputTerminal** i;
      double* v;
    
    // hier meckert g++ dann, dass die Typen nicht zusammen passen...
      for (i=VI.begin(), v=inV.begin(); i != VI.end(); i++, v++) {
        (*i)->set(*v);
      }
    };
    

Anmelden zum Antworten