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)
OriginalL'auteur Rob N | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de changer votre Maclasse::haskey méthode de trop.
Explication d'un tel comportement est à la section "recherche d'un Nom, des modèles, et l'accès des membres de classes de base" sur http://physics.ucsd.edu/students/courses/winter2008/physics141/manuals/rhel-gcc-en-4/c---misunderstandings.html (lien d'une autre réponse de commentaire, juste au cas où).
Ensemble fixe un exemple de code: http://ideone.com/G7Rty
Ce lien est rompu ou derrière un paywall. Tout à jour des références?
OriginalL'auteur asciz
Cette ligne doit être aussi,
typename
.si la classe dérivée ne peut pas voir la classe de base typedefs?
Lorsque la classe de base est un modèle, le compilateur ne peut pas savoir à analyser en temps si la classe contient en fait que la définition de type ou pas. Par conséquent, vous devez utiliser typename explicitement les types de référence.
Pas si la classe de base dépend de paramètres du modèle (c'est à dire, de la classe de base à utiliser peut varier en fonction des paramètres de modèle). Regardez physics.ucsd.edu/students/courses/winter2008/physics141/manuals/... pour obtenir certaines informations.
Willcock merci pour l'explication. Je pense que ce doit être ajouté à la réponse.
OriginalL'auteur Nawaz