2016-06-11 11 views
0

Das ist mein Behälter:Erwartete primären Ausdruck vor 'Paar'

std::map<std::string, Node> idents 

Knoten und Variable Klassen:

class Node { 
}; 

template <class T> class Variable : public Node { 
public: 
    T value; 
    Variable(T arg) : value(arg) { } 
    ~Variable(); 
}; 

Und ich habe diese Funktion:

void assignment(const char * name, const char * val) { 
    if(identifier_exists(name)) 
     printf("exist"); 
     else { 
      try { // Assume `val` is a number 
       double num = std::stod(val); 
       auto variable = new Variable<double>(num); 
       idents.insert(std::pair<std::string, Variable<double>> pair( std::string(name), variable)); 
      } catch (const std::invalid_argument&) { // It's a string 
        auto variable = new Variable<std::string>(val); 
        idents.insert(std::pair<std::string, Variable<std::string>> pair(std::string(name), variable)); 
      } 
     } 
} 

ich das bekommen Fehler beim Kompilieren:

node.cpp:20:62: error: expected primary-expression before ‘pair’ 
     idents.insert(std::pair<std::string, Variable<double>> pair( std::string(name), variable));                
                   ^~~~ 
node.cpp:23:67: error: expected primary-expression before ‘pair’ 
     idents.insert(std::pair<std::string, Variable<std::string>> pair(std::string(name), variable));               
                    ^~~~ 

Die Funktion muss suchen, wenn die Variable bereits existiert (namentlich) und falls nicht, sie in die Karte einfügen. Die Variablenklasse dient als Container für verschiedene Arten von Werten. Knoten dient dazu, die Karte zu erstellen, ohne den Wert für eine bestimmte Variable instanziieren zu müssen.

+3

Der Versuch, beheben Sie den Compiler-Fehler ist eine Verschwendung von Zeit. Nachdem der Kompilierungsfehler behoben wurde, wird dieser Code wegen [object slicing] (http://stackoverflow.com/questions/274626/what-is-object-slicing) sowieso nicht funktionieren. Die Karte enthält 'Node's. Wenn Sie versuchen, eine Unterklasse von 'Node' in die Map einzufügen, wird die Unterklasse in den Drain- Bereich verschoben. C++ ist nicht Java. –

+0

das unterstrichene Wort 'Paar' herausnehmen. (Aber lesen Sie auch Sams Kommentar) –

+0

Vielen Dank, @SamVarshavchik, mir war nicht bewusst, dass _object slicing_. Ich werde auf diese grundlegenden Fehler eingehen. –

Antwort

3

Es gibt mehrere Probleme hier:

  1. Sie versuchen, einen Zeiger (Variable = new Variable < ....>) einfügen und die Karte Zeiger nicht statt. Vielleicht möchten Sie stattdessen std::map<std::string, Node*> idents;. Mit dem Zeiger in der Karte verwenden, vermeiden Sie auch das Objekt Slicing Problem, das Sie sonst Gesicht würde

  2. Ihr Einsatz wie idents.insert(std::pair<std::string, Node*>(name, variable)); aussehen sollte (dh. Ein Knoten Zeiger verwenden, und entfernen Sie die zusätzliche pair)

+0

Ja, die Übergabe eines std :: pair-Objekts war der richtige Weg, ich habe 'make_pair' verwendet. Verwende auch 'Node *' jetzt, aber ich vermute, dass 'Variable'-Werte nicht zugänglich sind, wenn sie nicht von' Node' geerbt werden, weil 'Variable' als' Node' behandelt würde. Trotzdem danke. –

+0

Es gibt einige Möglichkeiten, auf Variablenwerte zuzugreifen: 1. Erstellen Sie virtuelle Accessor-Funktionen in der Basisklasse. Dies erfordert ein spezifisches Überschreiben in den Variablen . 2. Wenn Sie genau wissen, welche Art von Variable * Sie haben, können Sie einen Typcast erzwingen. 3. Sie können dynamic_cast verwenden, um Ihr eigenes RTTI-System zu testen oder zu implementieren – jtlim