erreur C2106: '=' : l'opérande gauche doit être l-valeur
En regardant les autres questions concernant l'erreur C2106, je suis toujours perdu à ce que le problème est avec mon code. Lors de la compilation j'obtiens les erreurs suivantes:
c:\driver.cpp(99): erreur C2106: '=' : l'opérande gauche doit être l-valeur
c:\driver.cpp(169): erreur C2106: '=' : l'opérande gauche doit être l-valeur
La ligne de code est comme suit:
payroll.at(i) = NULL; //Line 99
payroll.at(count++) = ePtr; //Line 169
Je suis à défaut de comprendre pourquoi cette erreur est levée. Dans ce projet, j'ai changé mon driver.cpp à partir d'un tableau de l'employé pointeurs d'objet personnalisé Vecteur modèle que j'ai fait. Je déclare le Vecteur comme suit...
//Declare an Vector to hold employee object pointers
MyVector <employee*> payroll;
Toute aide est appréciée...
Ce n'MyVector::au retour?
MyGuess :
c'est ce qu'il est de retour... "retour montableau[n];" à moins que la référence est supérieure à la taille de vecteur ensuite, il retourne la valeur qui a été transmis à la fonction.
Qu'est-ce que le type de retour (qui détermine la comment retour ce vous retour)?
MyGuess :
YourVector::at()
doit être de retour par valeur qui est le problème.c'est ce qu'il est de retour... "retour montableau[n];" à moins que la référence est supérieure à la taille de vecteur ensuite, il retourne la valeur qui a été transmis à la fonction.
Qu'est-ce que le type de retour (qui détermine la comment retour ce vous retour)?
OriginalL'auteur KQball | 2013-07-29
Vous devez vous connecter pour publier un commentaire.
Cette erreur est levée pour la même raison, vous ne pouvez pas faire quelque chose comme ceci:
Votre version de
Vector::at
devrait être de retour d'une référence plutôt qu'une valeur.Lvalues sont appelés Lvalues parce qu'ils peuvent apparaître sur la gauche d'une affectation. Rvalues ne peut pas apparaître sur le côté gauche, qui est pourquoi nous les appelons des rvalues. Vous ne pouvez pas affecter de
3
à36
parce que36
n'est pas une lvalue, c'est une rvalue, temporaire. Il n'a pas une adresse de mémoire. Pour la même raison, vous ne pouvez pas affecterNULL
àpayroll.at(i)
.Votre définition:
Ce qu'elle devrait être:
Vous avez raison, mais c'est une coutume de la mise en œuvre d'un vecteur
MyVector
lol.. désolé de l'homme.Dans l'hypothèse d'une dirigée disposition de la mémoire, la paramater de
at
devrait êtreunsigned
.Le paramètre de
at
devrait probablement êtresize_t
, mais ce n'est pas vraiment le plus gros problème ici.OriginalL'auteur Mohamad Ali Baydoun
Dit le message que vous essayez d'attribuer à une expression qui n'est pas une lvalue. Pour les types intégrés, vous ne pouvez attribuer à lvalues (d'où le nom vient de la: lvalue = valeur qui peut être sur le gauche côté de l'opérateur d'affectation, tandis que la valeur r = valeur qui doit être sur le droit côté de l'opérateur d'affectation).
Alors, quelle est une lvalue ou une rvalue? Considérons le code suivant:
Dans cette mission
a
est une lvalue (si ce n'était pas le cas, le compilateur puisse se plaindre). C'est l'expression dea
se réfère à un objet qui peut être modifié. D'autre part,3
est une rvalue, qui est, fondamentalement, une valeur. Bien sûr, vous ne pouvez pas affecter de3
; le compilateur puisse se plaindre à propos de la déclaration3=a;
avec exactement le même message que vous avez obtenu dans votre code.Donc comme un première approximation, une lvalue désigne un objet, tandis qu'une rvalue désigne une valeur. Notez que cela est également vrai pour l'affectation de la forme
où
b
est aussi une variable. Ce qui se passe ici est le soi-disant lvalue à rvalue de conversion: Ce qui est attribué n'est pas l'objetb
, mais sa valeur actuelle.Maintenant, considérons le cas suivant:
Ici, vous pourriez dire que la fonction
f
retourne un objet (si vous utilisez un type défini par l'utilisateur, vous pouvez même voir sa construction/destruction). Mais le compilateur se plaint toujours avec le message que vous avez obtenu. Pourquoi?Bien, même si vous vous considérez
f
pour retourner un objet, c'est un temporaire objet qui va s'en aller immédiatement. Donc il ne fait pas beaucoup de sens à attribuer une valeur parce que vous ne pouvez pas faire quelque chose avec elle de toute façon par la suite.Donc voici la deuxième règle:
Chaque fois qu'il y a une expression qui produit une objet temporaire, C++ définit cette expression comme rvalue.
Et maintenant, nous arrivons à la définition de
MyVector::at()
que vous n'avez pas de spectacle, mais qui, selon le message d'erreur, probablement ressemble à ceci:Cela a essentiellement la même forme que
f
ci-dessus, car il renvoie également unT
(unemployee*
dans votre cas). C'est pourquoi le compilateur se plaint.Et que la plainte est utile: Même si le compilateur ne pas se plaindre, le code ne serait pas dio ce que vous avez presque certainement prévu. Le
return
instruction renvoie une copie de l'objetdata[i]
. Ainsi, si la déclarationpayment.at(i)=NULL;
avait compilé, ce qui serait effectivement se produire serait le suivant:data[i]
(ou si vous l'avez appelé dans votre code) est copié et la copie temporaire retourné.MyVector
inchangé.Ce n'est presque certainement pas ce que tu voulais. Vous avez voulu changer l'objet interne. Pour ce faire, vous devez retourner un référence à cet objet. Une référence se réfère à l'objet qu'il a été initialisé avec au lieu de faire une copie. En conséquence, une référence, même lorsqu'il est retourné, est une lvalue (depuis C++11, il y a un deuxième type de référence qui se comporte différemment, mais nous n'avons pas besoin de soins à ce sujet ici). Votre corrigée en fonction de lit
et avec cette définition,
payment.at(i)=NULL;
non seulement compile, mais en fait ce que vous voulez: Changer le stockée en internei
-th pointeur danspayment
àNULL
.OriginalL'auteur celtschk
Votre fonction
MyVector::at(unsigned)
est probablement pas correctement déclaré et ressemble à ceci:Ce que vous voulez, c'est pour qu'elle ressemble à ceci:
Avis le paramètre de référence (&), qui sera de retour quel que soit l'élément de référence et de permettre l'expression pour être utilisé comme une l-value.
La vraie question est pourquoi n'utilisez-vous pas
std::vector
à la place?const
surchargeOui, il avait besoin d'un const surcharge. J'ai gardé les choses simples pour plus de clarté.
C'est pourquoi vous n'avez pas de code en C 😀
OriginalL'auteur Silex
le terme l-valeur en c++ signifie la "gauche de la valeur" est du mauvais type. Puisque vous êtes à l'aide de l'opérateur d'affectation sur elle, pour être le bon type, il doit être une valeur qui peut être affecté à une nouvelle valeur, ce qui signifie qu'il ne peut pas être une constante. Très probablement, votre appel à
payroll.at()
est de retourner une valeur constante au lieu d'une référence à la valeur réelle. Essayez d'affecter une nouvelle valeur à il va alors provoquer un l-valeur d'erreur.OriginalL'auteur Lochemage