9
votes

C ++ Vecteur de vecteurs

J'ai un fichier d'en-tête de classe appelé Grid.h contenant les 2 données privées suivantes:

error C2109: subscript requires array or pointer type


1 commentaires

Toute raison que vous prenez ces paramètres par référence? Si quelque chose, ils devraient être une référence constante, mais généralement des types fondamentaux ne devraient pas être transmis par référence à moins que vous n'ayez besoin. En outre, pourquoi deux vecteurs? Le vecteur à l'intérieur d'un vecteur est à la fois, votre colonne est juste quelque chose d'autre.


5 Réponses :


20
votes

Dans la ligne Rangez la ligne [ligne] [COL]; La première ligne est le int & , pas le vecteur < /code..

La variable déclarée dans la portée intérieure est l'observation de la variable dans la portée extérieure, le compilateur tente de tenter d'indexer un int plutôt qu'un vecteur , ce qui ne peut évidemment pas faire.

Vous devez corriger vos noms de variables afin qu'ils ne soient pas en conflit.

edit: aussi, tandis que le Une erreur que vous obtenez indique que le compilateur trouve la variable de ligne de ligne , car A. Levy souligne, vous avez également un problème avec la déclaration de votre vecteur , Donc, même si vous réparez les noms de variables, si vous avez effectivement déclaré le vecteur comme indiqué ici, il ne compilera pas. Les modèles imbriqués ont besoin d'espaces entre les symboles > , sinon le compilateur lira >> comme opérateur de droite plutôt que dans une déclaration de modèle. Il doit être xxx

ou xxx

en plus, comme vous le faites dans un fichier d'en-tête, vous "Je vais avoir besoin de mener à bien la balise" code> std :: sur le devant de n'importe quoi de l'espace de noms STD - tel que vecteur . Si c'était dans un fichier CPP, vous pouvez utiliser à l'aide de NAMESPACE STD; mais ce serait très mauvais à faire dans un fichier d'en-tête (puisqu'il polluerait l'espace de noms global). Sans la balise std :: étiquette ou à l'aide de instruction, le compilateur ne reconnaîtra pas vecteur .


2 commentaires

Si je change le nom des vecteurs en horizontale et verticale, je reçois des erreurs d'identifiant non déclarées pour chacun d'eux


Sinon, vous pouvez simplement faire "this-> rangée [rangée] [col]" et cela devrait fonctionner.



8
votes

Ce n'est probablement pas le problème d'index, mais vous avez également besoin d'un espace entre les crochets d'angle imbriqués dans votre vecteur de déclaration de type vectories. Les compilateurs C ++ ont du mal à dire à la différence entre les types de modèles imbriqués et l'opérateur de changement de bit droit.

Exemple: P>

vector<vector<int> >  vec2d;        // Good.

vector<vector<int>>   anotherVec2d; // Bad!

vector< vector<int> > yetAgain;     // Best IMHO. 
                                    // Keeps the white space balanced.


8 commentaires

@Kevenk, un espace entre les deux symboles empêche le compilateur de les traiter comme un seul opérateur. J'aimerais pouvoir downvote votre commentaire.


L'espace compte beaucoup dans ce cas. L'analyseur utilise Maximal Munch à Analyser, de sorte qu'il attrape la plus grande jeton qu'elle peut. Cela signifie que dans vecteur > il parsa >> comme opérateur de changement plutôt que dans une déclaration de modèle. Vous avez besoin de l'espace supplémentaire pour indiquer au compilateur que vous déclarez un modèle plutôt que d'une expression avec un opérateur de changement de vitesse.


Cela a été changé maintenant. Si vous utilisez un compilateur actuel, vous pouvez probablement écrire "Vecteur >" et obtenez ce que vous attendez. Pas encore standard mais VS2010, G ++ et presque certainement les autres le soutiennent maintenant.


G ++ / GCC 4.5.0 (Je viens de l'essayer) ne manquera pas de compiler sans l'espace supplémentaire. Il peut y avoir un drapeau pour le dire d'utiliser des fonctionnalités de la norme à venir, mais sans aucun drapeau supplémentaire compilateur, vous avez besoin de l'espace ou de compilera. Maintenant, cela vous indique explicitement ce que vous avez mal fait plutôt que de vous plaindre de l'opérateur de travail, mais cela ne parvient toujours pas à compiler.


Standard C ++ nécessite actuellement l'espace au milieu de >>, bien que certains compilateurs puissent le permettre. C ++ 0X rendra les greffés >> légaux.


@ Mark / Jonathan: Mes excuses si mon commentaire n'était pas garanti d'être correct sur chaque compilateur. Je suis un peu corrigé, bien que vraiment cela ressemble à une lacune dans certains compilateurs. Je ne peux pas dire que j'ai utilisé trop de compilateurs différents personnellement, mais je sais que cela a fonctionné avec Microsoft C ++ compilateurs depuis au moins VC ++ 2005 (éventuellement plus tôt).


La définition de type "vecteur >" n'est pas légale C ++ sous la norme en cours. Il sera légal sous C ++ 0X, selon le projet de proposition.


Donc, vraiment, c'est une lacune dans la langue, pas le compilateur. Certains écrivains compilateurs ont choisi de casser la norme afin de contourner cette déficience (qui est pratique si c'est le seul compilateur que vous utilisez, mais blesse autrement la portabilité et causent des problèmes), tandis que d'autres ont choisi de suivre la norme. Heureusement, la prochaine standard fixe cette carence dans la langue afin qu'elle ne soit plus une question. Je ne dirais vraiment pas que c'est une carence dans les compilateurs cependant, car c'est la manière dont la norme actuelle est.



1
votes

Cela me semble (bien que vous ayez peut-être besoin de vérifier cela par vous-même, je n'ai pas envie de écrire une demande de test) que le problème provient du fait que votre paramètre contient un nommé < / Code> Et votre classe a une variable interne ligne et il y a un conflit de dénomination.

Vous devrez peut-être pouvoir qualifier la ligne que vous utilisez. Considérez: xxx


5 commentaires

Ou retourner cette ligne-> rangée] [col]


J'ai renommé rangée et colonne dans la section privée: section à horizontale et verticale. Je reçois maintenant l'erreur "horizontal: identifiant non déclaré" et "vertical: identifiant non déclaré"


@XBONEZ: Pourquoi avez-vous deux vecteurs? Je pensais que tu voulais un vecteur de vecteurs? (Donner un vecteur 2D.)


J'aimerais pouvoir uppoter cela en bonne conscience, car il est techniquement correct. C'est juste la mauvaise solution pour le problème.


@Gman: J'ai fait une autre colonne "Vector , alors quand je veux ajouter un vecteur à la ligne, je peux faire Row.Push_back (colonne). Quand j'utilise la poussée de la rangée, je dois transmettre un vecteur comme un argument, n'est-ce pas?



4
votes

Je pense que vous voulez quelque chose comme ça ... (bien que je ne puisse pas imaginer pourquoi: -)) xxx


2 commentaires

Aahhh !! Oui, cela semble un meilleur moyen de le faire. Je n'y pensais pas. De cette façon, je n'ai pas besoin de nier des vecteurs. Merci beaucoup. Je vais l'utiliser de cette façon.


Cette réponse consiste toujours à imbriquer des vecteurs de la même manière, uniquement sous un alias Typedef style C qui n'est pas compatible avec les modèles ...



3
votes

C'est ce dont vous avez besoin:

return Grid::row[row][col];


0 commentaires