std::multimap als Parameter übergeben



  • Hallo,

    ich bekomme fogenden Fehler:
    error C2955: 'multimap' : Fuer die Verwendung einer Vorlagenklasse ist eine Vorlagen-Argumentliste erforderlich
    c:\programme\microsoft visual studio\vc98\include\map(286) : Siehe Deklaration von 'multimap'

    code: .cpp

    #include <map>
    bool insertW(std::multimap ewp) { 
    
    ..
    return true;
    }
    

    code .h
    #include <map>

    bool insertW(std::multimap ewp);
    

    Kann man generell keine map als Parameter übergeben? Evtl. weil sie beliebig gross sein kann. Oder habe ich falsche Syntax?

    schon mal vielen Dank für Antwort!



  • multimap ist keine Klasse, sondern ein Template. Das heißt, du mußt dem Compiler noch dazusagen, welche Spezialisierung davon du verwenden willst, z.B.:

    bool insertW(std::multimap<int,double> ewp) { 
      ...
      return true;
    }
    

    (und eventuell ist es eine gute Idee, die map als (const) Referenz zu übergeben - das ist zwar nicht erforderlich, spart aber Kopier-Operationen)



  • ja klar, danke.

    Leider habe ich jetzt das Problem, wie ich auf alle Elemente der map zugreife.
    Die Multimap sieht so aus:
    std::multimap<string,MeineStruct> EWP

    MeineStruct besteht aus 5 string Attributen.
    Das insert hat auch funktioniert, hast Du mir in einen anderen Thread gepostet.
    EWP.insert(make_pair(a,MeineStruct(b,c,d,e,f)));

    hier mein Problem bein Zugriff:

    std::multimap<std::string,MeineStruct>::iterator it = m_navContainer->EWP.begin();
    while( it != m_navContainer->EWP.end() ) {
    ++it;
    
     it->second.MeineStruct.b; //hier Fehler, habe sinnlos rumprobiert
    
    }
    


  • Und wie lautet denn der Fehler? Ich bin echt schlecht darin, aus so einem Fragment abzulegen, was du für Mist gebaut haben könntest (das einzige Problem wäre, daß du von außen nicht an die Member herankommen könntest wegen fehlender Zugriffsrechte).



  • Mach das MeineStruct weg. Das ist dein Typname, den brauchst du hier nicht.



  • Oh sorry.
    Ich war mir nicht sicher, ob ich den Iterator und Zugriff auf die struct richtig verwende. Klar ist mir, wenn der Wert der multimap keine struct, sondern ein einfacher Datentyp wäre, könnte ich mit it->second darauf zugreifen.

    Bei it->second kommt auch keine Fehlermeldung, die kommt wenn ich die einzelnen Attribute der struct an sprechen will.

    hier die Meldung:
    error C2274: 'function-style cast' : Unzulaessig auf der rechten Seite des Operators '.'
    error C2228: Der linke Teil von '.b' muss eine Klasse/Struktur/Union sein

    hier die Dekl. in .h
    struct MeineStruct
    { 
      string att1; 
      string att2; 
      string att3;
      string att4;
      string att5; 
    
      MeineStruct(const string& a1,const string& a2, const string& a3,const string& a4, const string& a5) {
    	  att1 = a1;
    	  att2 = a2;
    	  att3 = a3;
    	  att4 = a4;
    	  att5 = a5;
      } 
    };
    

    hier die Zuweisung in .cpp

    std::istream_iterator<string> afi (quelle);
    	std::istream_iterator<string> eof;
    	while (afi != eof) { 
    
    		std::string a = *afi++;		//Nick
    		std::string b = *afi++;		//Name	
    		std::string c = *afi++;		//typ
    		std::string d = *afi++;		//lat
    		std::string e = *afi++;		//lon	
    		std::string f = *afi++;		//frequenz
    
    		// speichern in map
    
    		if (c == "VOR") {
    			//	cout << "todo map VOR"<< endl;
    
    			VOR.insert(make_pair(a,NavData(b,c,d,e,f))); 
    
    		}
    		else if (c == "EWP") {
    			//	cout << "todo map ewp"<< endl;
    			EWP.insert(make_pair(a,MeineStruct(b,c,d,e,f))); 
    
    		}
    


  • Da greifst du mit it->second.attr1; etc auf die Member zu (btw, ich würde erst zugreifen und dann weiterlaufen ;)).



  • Danke, ich hab völlig auf dem Schlauch gestanden!

    Habe statt das Attribut att1.., den Parameter a1 genommen.


Anmelden zum Antworten