erreur: il n'y a pas d'arguments à 'à' qui dépendent d'un paramètre du modèle, si une déclaration d'au doivent être disponibles
Noob ici,
Je suis en train de compiler ce segment de code à partir de Bjarne Stroustrup " Le Langage de Programmation C++", mais CodeBlocks garde en me jetant à cette erreur.
Le code est sur le contrôle de la portée d'un tableau tenu à un vecteur de fonction.
Voici le code:
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int i = 1000;
template<class T> class Vec : public vector<T>
{
public:
Vec() : vector<T>() { }
T& operator[] (int i) {return at(i); }
const T& operator[] (int i) const {return at(i); }
//The at() operation is a vector subscript operation
//that throws an exception of type out_of_range
//if its argument is out of the vector's range.
};
Vec<Entry> phone_book(1000);
int main()
{
return 0;
}
Les erreurs renvoyées sont les suivantes:
- il n'y a pas d'arguments à 'à' qui dépendent d'un paramètre du modèle, donc une déclaration de 'a' doit être disponible
- note: si vous utilisez l'option '-fpermissive', G++ accepte votre code, mais en permettant l'utilisation d'un non déclaré nom est obsolète
- En fonction de membre de 'const T& operator[] (int i) const':
- il n'y a pas d'arguments à 'à' qui dépendent d'un paramètre du modèle, donc une déclaration de 'a' doit être disponible
- "Entrée" n'a pas été déclarée dans ce cadre
- modèle de l'argument 1 est invalide
- de type non valide dans la déclaration avant '(' token
Quelqu'un peut-il m'expliquer cela?
Aussi, comment pourrais-je mettre en œuvre ce que si je devais pas utiliser " using namespace std;'
Lorsque vous héritez de conteneurs stl, vous devez être conscient qu'ils n'ont pas un destructeur virtuel. Cela peut entraîner des problèmes lors de votre sous-classe acquiert des ressources qui devraient être libérés dans son destructeur.
La dernière question est triviale: soit écrire
La dernière question est triviale: soit écrire
std::
en face de chaque nom qui est venu de namespace std
, par exemple, écrire std::vector
partout, OU d'écrire using std::vector
une fois (au Lieu de namespace
, juste la liste de tous les noms que vous utilisez)OriginalL'auteur Bernardo Pliego-Garcia | 2015-04-01
Vous devez vous connecter pour publier un commentaire.
Remplacer
at
avecvector<T>::at
outhis->at
.Règles pour la façon dont les fonctions sont considérés dans les modèles sont plus importantes aujourd'hui que lors de C++ était conçu à l'origine.
Maintenant, méthodes dépendant de bases sont seulement regardé si vous
this->
, sinon c'est supposé être une fonction globale (ou un non-dépendant de la base de classe/local/etc).Cela peut aider à éviter les mauvaises surprises dans la pratique, si ce que vous avez pensé était un appel de méthode devient un global, ou un appel mondial devient un appel de méthode. Il permet également antérieure à la vérification du modèle de corps de méthode.
OriginalL'auteur Yakk - Adam Nevraumont
En plus de Yakk réponse, une autre solution serait d'ajouter
using vector<T>::at;
à
Vec
essentiellement de l'ajouter à la liste de regardé fonctions.De cette façon,
at()
peut être utilisé comme d'habitude, sans préfixant avec la classe de base ou de type dethis->
.OriginalL'auteur noma