2012-11-20 7 views
6

I eine STL Karte in C haben ++, wo der Schlüssel ein unsigned int ist und der Wert eine Klasse, deren Konstruktor ist:‚keine passende Funktion zum Aufruf‘ Fehler bei Klasse in eine STL Karte Einfügen

Foo::Foo(unsigned int integerValue){ 
    //Some stuff 
} 

zu anderen Klasse habe ich declarated die std :: map in der Kopfzeile:

private: 
    std::map<unsigned int, Foo> *m_mapFoo; 

und in der CPP-Datei habe ich es und eingefügt Instanzen von Foo:

m_mapFoo = new std::map<unsigned int, Foo>; 
m_mapFoo->insert(0, new Foo(0)); 
m_mapFoo->insert(1, new Foo(1)); 

Aber ich bin immer die folgende Fehlermeldung an den Einsatzmethoden:

no matching function for call to ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >::insert(const unsigned int&, Foo*)’ 

ähnliches Problem bei find-Methode:

m_mapFoo.find(0)->second->someFunctionIntoFooClass(); 

Wo der Fehler genau ist die folgende:

request for member ‘find’ in ‘((Foo*)this)->Foo::m_mapGeoDataProcess’, which is of non-class type ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >*’ 

Zusatz Hinweise: Ich habe keinen Foo-Kopierkonstruktor, aber ich glaube nicht, dass das das Problem ist.

Hilfe zum Verständnis dieser Fehler?

+0

Wie wollen Sie in einer Karte kopieren erwarten, wenn Sie keine Kopie Konstruktor? – Pubby

+0

Ich habe rund um stackoverflow gelesen und einige Leute sagen, Sie müssen, manche sagen, Sie brauchen nicht. Aber ich weiß nicht, ob das nur für die Einfügung von [] gilt und nicht die Methode. Siehe http://stackoverflow.com/questions/1478330/c-stl-map-with-a-custom-class-as-second-type –

+0

Sie benötigen den Kopierkonstruktor für 'insert'. 'emplace' braucht es allerdings nicht. – Pubby

Antwort

6

Sie haben einen Zeiger auf eine Karte Foo Werte

std::map<unsigned int, Foo> *m_mapFoo; 

enthält, und Sie sind Behandlung, als ob es Foo Zeigerwerte enthalten:

std::map<unsigned int, Foo*> *m_mapFoo; 

Try this:

m_mapFoo = new std::map<unsigned int, Foo>; 
m_mapFoo->insert(std::make_pair(0, Foo(0))); 
m_mapFoo->insert(std::make_pair(1, Foo(1))); 

Was den zweiten Fehler, Sie einen Zeiger auf eine Karte haben, so müssen Sie

std::map<unsigned int, Foo>::iterator it = m_mapFoo->find(0); 
if (it) { 
    it->second.someFunctionIntoFooClass(); 
} else { 
    // entry not found 
} 
+0

Das scheint zu funktionieren, danke! Aber immer noch der zweite Fehler bei der Methode find. Irgendeine Idee? –

+0

@RomanRdgz Ich habe etwas über den zweiten Fehler hinzugefügt. Beachten Sie, dass Sie das Ergebnis von 'std :: map :: find' überprüfen sollten. – juanchopanza

+0

der Fehler bleibt, das gleiche: Anfrage für Mitglied finden ... Ich habe auch mit gleichen Ergebnissen (ich hatte vergessen) –

3

Ihre Karte eingegeben speichern Objekte vom Typ Foo, nicht Zeiger auf Objekte vom Typ Foo. Sehen Sie, wie Sie die Elemente mit new zu initialisieren sind versuchen und ihre Mitglieder Zugriff über ->, möchten Sie wahrscheinlich:

private: 
    std::map<unsigned int, Foo*> *m_mapFoo; 
+0

Ich habe schon darüber nachgedacht, aber das Problem bleibt –

0

Von den kleinen Informationen, die Sie geben, so scheint es unwahrscheinlich, dass Sie Zeiger verwenden müssen überall : try this:

In der Kopfzeile:

private: 
    std::map<unsigned int, Foo> m_mapFoo; 

Und th e CPP-Datei:

m_mapFoo[0] = Foo(0); 
m_mapFoo[1] = Foo(1); 

Die Semantik operator[] sind etwas anders als .insert(). Wenn Sie .insert() benötigen, verwenden Sie es. Aber wenn Sie sich nicht auf den feinen Unterschied verlassen, verwenden Sie den besser lesbaren operator[].

Ähnlich bei der find-Methode wird der Ausdruck viel besser lesbar, wenn Sie Zeiger vermeiden und verwenden operator[]:

m_mapFoo[0].someFunctionIntoFooClass(); 
Verwandte Themen