vector vom map deklaration

Padawan

Erfahrenes Mitglied
Hallo alle,

aktuell programmiere ich unter Linux mit dem gcc bzw. g++ Compiler mit eclipse CDT. Dabei habe ich folgende Klasse geschrieben:
C++:
#include "Value.h"

Value::Value(vector< map <string,double> > value) {
    this->value = value;
}

void Value::setValue(map <string,double> value){
   this->value.push_back(value);
}

vector< map <string,double> > Value::getValue(){
   return value;
}

Mit folgendem Header:
C++:
#include <vector>
#include <string>
#include <map>

#ifndef VALUE_H_
   #define VALUE_H_

using namespace std;

class Value {
   private:
     long timestamp;
     vector< map <string, double> > value;

   public:
     Value(vector< map <string,double> > value);
     virtual ~Value();

     void setValue(map <string,double> value);
     vector< map <string,double> > getValue();
};

#endif

In der .cpp Datei bekomme ich folgende Mehlermeldung:
Description Resource Path Location Type
'>>' should be '> >' within a nested template argument list Value.cpp /Bachelorarbeit/src line 12

mit dem Verweis auf den Funktionskopf, der Funktion getValue().
Hab bisher schon versucht, die < und > beianander zu schreiben bzw. mit verschiedenen Variationen und wiss aktuell keine lösung, da die Fehlermeldung immer noch aufkommt.

Ich hoffe Ihr könnt mir weiterhelfen.

lg
Padawan
 
Zuletzt bearbeitet:
Hi

wenn ich in setValue das alleinstehende vector<map<>> wegkommentiere (was soll das da?)
und eine (leere) Implementierung für den Destruktor mache ( also {} statt ; )
dann kompiliert das zB. hier: http://ideone.com/VVHdeY,
und die genannte Fehlermeldung bekomm ich auch ohne die zwei Behebungen nicht.
Welche Version (g++ --version) und welche Aufrufparameter verwendest du?

(und die ganzen Leerzeichen bei den <> kann man sich mit einem aktuellen Compiler sparen)
 
Hi,

hab vector<map<>> raus genommen (da ist mir beim rüber kopieren ein Fehler unterlaufen :))

g++ ist in der version 4.8.4.

Bei mir ist die Fehlermeldung weggegangen, als ich die Zeile neu geschrieben habe.
 
Hi Padawan

Fyi: using namespace std; in einem Header ist äusserst schlechte Praxis und sollte nie den Weg in deinen Code finden.

Viele Grüsse
Cromon
 
Hättest du evtl. einen Vorschlag für mich, wie es besser gelöst werden kann?
Immer das "std::" ausschreiben. Also statt
C++:
using namespace std;

string s;
vector<string> v;
//etc.
Das hier:
C++:
std::string s;
std::vector<std::string> v;
//etc.
"using namespace" macht halt einfach das namespace-Prinzip kaputt.
Namespaces sind eigentlich dafür gedacht, mehrere Funktionen gleichen Namens zu ermöglichen.
C++:
namespace ns1
{
    void bsp()
    {
        std::cout << "bsp in ns1" << std::endl;
    }
}

namespace ns2
{
    void bsp()
    {
        std::cout << "bsp in ns2" << std::endl;
    }
}

int main(int argc, char* argv[])
{
    ns1::bsp(); //Gibt "bsp in ns1" aus
    ns2::bsp(); //Gibt "bsp in ns2" aus
    return 0;
}
Wenn du nun ein "using" voranstellst, dann sieht es möglicherweise so aus:

C++:
namespace ns1
{
    void bsp()
    {
        std::cout << "bsp in ns1" << std::endl;
    }
}

namespace ns2
{
    void bsp()
    {
        std::cout << "bsp in ns2" << std::endl;
    }
}

using namespace ns1;

int main(int argc, char* argv[])
{
    bsp(); //Gibt "bsp in ns1" aus
    ns2::bsp(); //Gibt "bsp in ns2" aus
    return 0;
}
Da kann man sagen, dass das ja kein Problem sei, da es ja klar und eindeutig ist. Aber gerade bei grossen Projekten und Dateien kommt es schnell vor, dass etwas Falsches verwendet wird. Ein existierendes Beispiel ist übrigens unter Windows bei den std::max und std::min-Funktionen.
Die Windows.h definiert max und min, die <algorithm> std::max und std::min. Bei einem schlecht platzierten "using namespace std;" kann das zu einigem mühsamen Fehlersuchen führen.
(Siehe edit)
Also grundsätzlich "schadet" das "using namespace" nicht direkt. Aber man kann sich eine Menge mühsamstes Debugging ersparen, wenn man es nicht nutzt. Entsprechend wird bei den meisten Projekten im Styleguide jegliches "using namespace" verboten.

Gruss
cwriter

/EDIT:
Bei Windows minmax ist das Problem ein anderes: min und max sind keine Funktionen, sondern Makros, sodass nach dem std:: ein Makrocode eingefügt wird. Auch wenn mir jetzt gerade kein richtiges Beispiel für Namespaceprobleme einfällt, ist das theoretische Problem dennoch wie beschrieben.
 
Zuletzt bearbeitet:
Die von cwriter angesprochenen Probleme, die in der windows.h für #define existieren kriegst du auch relativ schnell mit namespaces wenn du using namespace std; hast und algorithm inkludierst. Da hast du nette Funktionen wie std::count, std::find, std::equal, std::copy, std::move, std::rotate, std::fill, usw drin. Das sind dann zu allem Überfluss noch alles Funktionen bei denen so gut wie alle Parameter templates sind, die also liebend gerne fast alle Overloads entgegen nehmen. Da passiert es dann ganz schnell mal, dass das template aus der STL für den Compiler ein besserer Match ist als die von dir gleich benannte Funktion. Im Idealfall gibts nen Compilerfehler, im Normalfall hast du dann ganz schöne Fehler zu Laufzeit.
 
Zurück