map als Speicher ?!?!



  • Dachte ich mir, bekomme aber trotzdem wenn ich in einer anderen Methode von mybank mit

    db.insert(Kontonummer, gk);
    

    etwas in die map einfügen will diese riesen Fehler ...

    In member function Bank::Girokonto& Bank::MyBank::createGirokonto(unsigned int, const Bank::Kunde&)': no matching function for call tostd::map<const unsigned int, Bank::Konto*, std::less<const unsigned int>, std::allocator<std::pair<const unsigned int, Bank::Konto*> > >::insert(const unsigned int&, Bank::Girokonto*&)'
    note: candidates are: std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [with _Key = const unsigned int, _Tp = Bank::Konto*, _Compare = std::less<const unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, Bank::Konto*> >]
    note: typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, const std::pair<const _Key, _Tp>&) [with _Key = const unsigned int, _Tp = Bank::Konto*, _Compare = std::less<const unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, Bank::Konto*> >]

    Was bedeutet das überhaupt ??? 😕



  • Hallo,

    Von welchen Typ ist denn gk? Deine map erwartet einen Pointer auf Bank::Konto.

    Ciao



  • gk ist nen Zeiger auf ne Unterklasse von Konto nämlich Girokonto sollte also funktionieren.



  • Ein wenig mehr Code wäre jetzt hilfreich.



  • carnage schrieb:

    Dachte ich mir, bekomme aber trotzdem wenn ich in einer anderen Methode von mybank mit

    db.insert(Kontonummer, gk);
    

    etwas in die map einfügen will diese riesen Fehler ...

    In member function Bank::Girokonto& Bank::MyBank::createGirokonto(unsigned int, const Bank::Kunde&)': **no matching function for call** tostd::map<const unsigned int, Bank::Konto*, std::less<const unsigned int>, std::allocator<std::pair<const unsigned int, Bank::Konto*> > >::insert(const unsigned int&, Bank::Girokonto*&)'
    note: candidates are: std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [with _Key = const unsigned int, _Tp = Bank::Konto*, _Compare = std::less<const unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, Bank::Konto*> >]
    note: typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, const std::pair<const _Key, _Tp>&) [with _Key = const unsigned int, _Tp = Bank::Konto*, _Compare = std::less<const unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, Bank::Konto*> >]

    Was bedeutet das überhaupt ??? 😕

    Bedeutet dass es die Methode die du aufrufen willst nicht gibt (Parameter)... sieht durch die ganzen Templates ein wenig kryptisch aus.

    Du suchst

    db.insert(make_pair(Kontonummer, gk));
    // (fuegt nur ein wenn zum key_type noch nichts in der map steht,
    //  Erfolg nachzulesen im zurueckgegebenen pair.second)
    
    // oder
    db[Kontonummer] = gk;
    


  • Bitteschön;-)

    #include <iostream>
    
    #include "mybank.h"
    
    using namespace std;
    
    namespace Bank
    {
       MyBank::MyBank()
       {}
    
       Girokonto& MyBank::createGirokonto(unsigned const int Kontonummer, const Kunde& k)
       {
          Girokonto* gk = new Girokonto(Kontonummer,k);
          Konto* ko;
    	  ko = gk;// abspeichern der Verweises auf das Konto
          db.insert(Kontonummer, ko);
          return *gk;
       }
       Sparkonto& MyBank::createSparkonto(unsigned const int Kontonummer, const Kunde& k)
       {
          Sparkonto* spk = new Sparkonto(Kontonummer,k);
          // abspeichern der Verweises auf das Konto
          db.insert(Kontonummer, spk);
          return *spk;
       }
       // Ueberweisung innerhalb der Bank
       // BankException, wenn Ueberweisung nicht erfolgreich
       void MyBank::ueberweisen(Konto& k1, Konto& k2, int betragInCent) throw (BankException)
       {
          k1.auszahlen(betragInCent);
          k2.einzahlen(betragInCent);
       }
       // Ueberweisung innerhalb der Bank
       // BankException, wenn Ueberweisung nicht erfolgreich
       void MyBank::ueberweisen(int kontoNummer1, int kontoNummer2 , unsigned int betragInCent) throw (BankException)
       {
          if (kontoNummer1 < 0) throw BankException("Ungueltige kontonummer1");
          if (kontoNummer2 < 0) throw BankException("Ungueltige kontonummer2");
          db[kontoNummer1]->auszahlen(betragInCent);
          db[kontoNummer2]->einzahlen(betragInCent);
       }
       MyBank::~MyBank()
       {}
    
    }
    

    Deklarationen etc stehen in der myBank.h ...
    achja und da steht auch std::map<unsigned const int, Konto*> db; drin als Attribut!



  • Wenn schon mit der insert-Methode, dann so:

    db.insert (make_pair(Kontonummer, gk));
    // oder
    db.insert (pair<long,Konto> (Kontonummer, gk));
    

    Die insert-Methode der Map erwartet ein pair-Objekt.



  • Hi,

    auch möglich wäre

    typedef std::map<dein_typ,nochn_typ> my_map_t;
    
    dein_typ A;
    nochn_typ B;
    
    my_map_t map_;
    map_.insert(my_map_t::value_type(A,B));
    

    Is aber im prinzip das selbe... ausser deine map hat auf einmal kein std::pair mehr als value_type .. dann würde der code trotzdem funktionieren.



  • Danke 😉 Läuft jetzt alles !!!
    Aber wieso steht das nirgends das das so ist ??? Hab überall nachgeschaut aber das die pair erwartet wurde nirgends erwähnt ...
    Habt ihr nen allgemeinen Geheimtipp bezüglich C++-Informationen im Netz ... so ne Art ausführliche Referenz oder Kompendium ...



  • Also bei Fragen zur STL ist wohl das hier die Anlaufstelle:
    http://www.sgi.com/tech/stl/

    Ansonsten gibts hier auf der Seite doch auch ne Linkliste, oder ?



  • Wenn du C++ "Hobbymaessig betreibst", gehoert ein bisserl suchen im www halt dazu 🙂 iss eben nicht alles aufn 1. blick erreichbar ....

    Wenn du C++ Handwerklich betreibst, gehoert ne gute STL referenz in gebundener Form neben den Arbeitsplatz, es sei denn du hasst aussergweohnlich viel Flash ROM am Kleinhirn, so dass alle informationen nach einmaligen suchen da abrufen kannst 🙂

    grad bei algorythmen und bindings muss ich immer wieder nachschauen ... und dass jedesmal im www suchen, ausserdem sind die dokus da meist recht technisch enfach gehalten, nen konkretes beispiel iss viel schneller zu verarbeiten ...

    "Die C++ Standard Biblothek" kann ich da nur empfehlen, gibt aber sicher alternativen ...

    fuer dein Insert in der map wuerd ich fast immer version 3 empfehlen, also die Variante mit value_type. value_type iss nen typedef von der map auf den erwarteten pair typ. wenn mal die map aenderst, passts den pair zum inserten immer gleich mit an ...

    Ciao ...


Anmelden zum Antworten