c++ vecteur modèle de l'argument 1 est invalide
J'ai écrit un File
classe dans File.h
. Et j'ai écrit Répertoire de la classe dans Directory.h
qui est d'inclure File&
vecteur. Deux d'en-tête a même espace de noms.
Voici le code:
#include "File.h"
#include <vector>
class Directory : public File
{
public:
...
private:
std::vector<(File&)> files;
};
Lorsque j'essaie de compiler, il dit:
In file included from Directory.cpp:1:0:
Directory.h:29:30: error: template argument 1 is invalid
std::vector<(File&)> files;
^
Directory.h:29:30: error: template argument 2 is invalid
- Vous ne pouvez pas avoir
std::vector
de types de référence. Le type doit être copiable. Aucune raison de ne pas utiliserstd::vector<File>
? - Alors que je devrais utiliser des pointeurs? Je vous remercie.
- Et vous en avez besoin? Le polymorphisme?
- En effet. De ce fait, je ne peux pas utiliser le Fichier vecteur. Mais std::vector<Fichier>& fichiers fonctionne aussi, je suppose
- Non, ça ne marchera pas. le mieux est d'avoir vecteur de pointeurs intelligents.
- Ok, je vais utiliser un pointeur. Je vous remercie.
- Vous avez manqué LogicStuff point. Bien qu'il existe une relation, un pointeur intelligent est distincte à partir d'un pointeur.
Vous devez vous connecter pour publier un commentaire.
À clarifier les choses pour vous,
std::vector
exige de ses éléments à CopyAssignable, dont les références ne sont pas.std::vector<File&>
est un vecteur de références àFile
, notez questd::vector<(File&)>
est une erreur de syntaxe.- Vous pensé
std::vector<File> &
pourrait fonctionner, mais non. C'est une référence à un vecteur de quoi? Objets. Le polymorphisme de ne pas y travailler. Et vous auriez besoin d'une réellestd::vector<File>
instance de référence.Vous avez besoin d'un vecteur de pointeurs, qui peut être la copie attribué.
Si vous allez avec des pointeurs, vous aurez besoin de ne pas oublier
delete
avant de supprimer un élément, ou vous aurez une fuite de mémoire (si un objet a été alloué sur le tas, bien sûr). Pointeurs intelligents le fera pour vous:Référence:
std::shared_ptr
,std::unique_ptr
.