"Klasse std::map verwendet, die ohne template-Parameter" - Fehler
Ich würde sagen, ich bin kein Experte in der Verwendung der STL. Hier ist mein problem, ich habe eine Klasse Namens LdapClientManager, die behauptet, eine Reihe von LDAP-clients, die verwaltet werden von ID. Der Behälter mit der LdapClients ist deklariert als eine member-variable, d.h.
typedef std::map<int, LdapClient *> LdapClientMap;
LdapClientMap _ldapClientMap;
Folgende Funktion schlägt fehl, um die Kompilierung mit der Fehlermeldung:
LdapClient * LdapClientManager::getLdapClient(unsigned int templateID)
{
//Do we have an LdapClient
LdapClientMap::const_iterator it = _ldapClientMap.find(templateID);
if (it == std::map::end) {
//no existing client, lets create it
LdapClient * ldapClient = new LdapClient();
if (ldapClient == NULL) {
//TODO: handle out of memory condition
}
_ldapClientMap[templateID] = ldapClient;
return ldapClient;
}
return it->second;
}
Leider bekomme ich die folgende Fehlermeldung zur compile-Zeit, was bedeutet es. Ich habe noch keine Lösung gefunden in google, wie noch.
LdapClientManager.cc: In member function LdapClient*
template-Klasse std::map' verwendet werden, ohne die template-Parameter
LdapClientManager::getLdapClient(unsigned int)':
LdapClientManager.cc:33:
- Nur ein Hinweis, neu nicht NULL zurückgeben, in der out-of-memory Bedingungen, (es sei denn, Sie sind mit alten Compilern wie VC6). Es wirft std::bad_alloc exception.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersetzen
std::map::end
mit_ldapClientMap.end()
.Auch
new
nie 0 zurück, wirft es eine Ausnahme, wenn die Allokation fehlschlägt.Beachten Sie, dass das Programm gemacht werden kann, viel kürzer.
getLdapClient
gab eine Vorlage. Danke, EFraim.map
'soperator[]
null-initialisiert der Wert. Der code funktioniert Prima.Bedeutet es genau das, was es sagt, es bedeutet.
std::map
ist ein Klasse Vorlage. Es ist nicht eine Klasse, in der und von sich selbst. Es muss-template-Parameter, wie Sie verwendet werden, wenn Sie definiert dieLdapClientMap
geben. Später, sagen Siestd::map::end
, und der compiler sagt, dass muss Parameter zu.Aber Sie meinte wohl
_ldapClientMap.end()
. Jede Karte hat seine eigenen Ende;end
ist nicht eine statische Funktion, so müssen Sie rufen Sie es über eine Instanz. Wenn es waren statisch, würden Sie benötigt, um einen template-Parameter, genau wie bei der Definition der Art:std::map<int, LdapClient*>::end
.std::map::end() ist eine Memberfunktion der container-Instanz und nicht ein universeller Wert, so müssen Sie überprüfen das Ergebnis der std::map::find() gegen _ldapClientMap.end().
Noch ein paar Vorschläge, den code zu verbessern:
Sollten Sie es vermeiden, die Verwendung von Bezeichnungen mit einem führenden Unterstrich. Technisch ist es Undefiniertes Verhalten, auch wenn der compiler es zulässt, weil durch Sie in Konflikt mit aktuellen oder zukünftigen reservierten Namen.
_Foo
für argument-und member-Namen - als standard, der explizit sagt, dass Benutzer-code neu definieren diese Bezeichner über Makros U. B.).