Quelle est la signification de ce "manque d'arguments de modèle" C++ erreur

Ahh, les modèles C++...

Le code je vois,
fait sens pour moi,
mais GCC...
il n'est pas d'accord.

Le code suivant compile et s'exécute comme prévu, mais si vous ne commentez que #define, vous obtenez le message d'erreur dont je ne comprends pas. Le symbole iterator dispose toujours d'une seule chose, on peut se référer à: typedef dans la superclasse. Donc je suppose que j'ai deux questions: 1. Ce qui ne les erreurs veux dire? 2. Quel est le meilleur moyen de les corriger.

#include <map>
#include <string>
#include <cstdio>

using namespace std;

//#define WITH_TEMPLATE 1

#ifdef WITH_TEMPLATE
template <class C>
struct MyClass : public map<string, C>
#else
struct MyClass : public map<string, int>
#endif
{
    bool haskey(const string &s)
    {
        iterator it = find(s);
        return (it != end());
    }
};

int main()
{
#ifdef WITH_TEMPLATE
    MyClass<int> m;
#else
    MyClass m;
#endif
    m["test"] = 10;    
    printf("%d %d\n", m.haskey("test"), m.haskey("no"));
}

Erreurs de GCC:

temp.cc: En fonction de membre ‘bool Maclasse::haskey(const std::string&)’:
temp.cc:18: erreur: manquant arguments de modèle avant de, "elle",
temp.cc:18: erreur:`; ' avant ‘il’
temp.cc:19: erreur: ‘il’ n'a pas été déclarée dans le champ d'application
temp.cc:19: erreur: il n'y a pas d'arguments à la " fin "qui dépendent d'un paramètre du modèle, si une déclaration de la" fin " doit être disponible
temp.cc:19: erreur: (si vous utilisez ‘-fpermissive’, G++ accepte votre code, mais en permettant l'utilisation d'un non déclaré nom est déconseillée)

Avez-vous essayé le string::iterator?

OriginalL'auteur Rob N | 2011-02-03