'=' : l'opérande gauche doit être l-valeur
Quand je compile le code suivant, j'ai eu "erreur C2106: '=' : l'opérande gauche doit être l-valeur" à "m.msg_body[i].id = i;". Quand je commente cette ligne, il n'y a pas d'erreur. Quel est le problème avec mon code?
static const short MSG_DATA_MAX = 10;
struct MsgBodyData
{
int id;
string value;
};
class MsgBody
{
public:
MsgBody()
{
len = 0;
}
MsgBody(MsgBody & msg_obj);
~MsgBody() {}
int length() { return len; }
void setLength(int _len) { len = _len; }
MsgBodyData operator[](short index)
{
if(index > -1 && index < MSG_DATA_MAX)
return data[index];
MsgBodyData dump_data;
return dump_data;
}
void operator=(MsgBody & msg_obj)
{
len = msg_obj.length();
for(int i = 0; i < len; ++i)
data[i] = msg_obj[i];
}
private:
int len;
MsgBodyData data[MSG_DATA_MAX];
};
MsgBody::MsgBody(MsgBody &msg_obj)
{
operator=(msg_obj);
}
struct Msg
{
int msg_id;
string msg_title;
MsgBody msg_body;
};
void sendMsg()
{
Msg m;
m.msg_id = 1;
m.msg_title = "test_msg";
int size = MSG_DATA_MAX;
for(int i = 0; i < size; ++i)
{
m.msg_body[i].id = i; //HERE I GOT ERROR !!!
m.msg_body[i].value = "test_value";
}
}
Vous devez vous connecter pour publier un commentaire.
Votre
operator[]
retour par valeur, ce qui signifie qu'il fait une copie temporaire et des rendements. Temporaires sont rvalues. Vous devez modifier votre opérateur pour renvoyer une référence. En fait, vous devriez avoir deux versions, une version const, qui renvoie une référence const et non const version, qui renvoie à un non-const de référence.Votre méthode de traitement d'une hors de portée de l'indice devra changer si. Vous pouvez soit lancer une exception, ou tout simplement le laisser tel comportement indéfini, juste être sûr de le documenter. Une autre option serait d'avoir un mannequin
MsgBodyData
objet dans la classe que vous revenez quand vous obtenez un mauvais indice, mais cela semble être une très stupide de conception.MsgBodyData
être converti à NULL? Même si elle le pouvait, ce serait encore une rvalue. Après lancer une exception? Il n'y aurait pas de point, depuis l'instruction de retour ne serait jamais atteint.value
est de typestd::string
. Une classe, plutôt que sur une construite en. Il est possible (mais non recommandé) pour écrire un opérateur d'affectation pour une classe qui a des effets secondaires autres que d'attribuer à l'objet. Dans ce cas, l'affectation à une rvalue peut avoir du sens. Plutôt que de demander au compilateur d'analyser l'opérateur d'affectation pour les effets secondaires de ce genre, je suppose que le comité de normalisation a décidé de permettre simplement à travers le conseil d'administration. (C'est une supposition, je ne sais pas vraiment ce que le comité des normes de raisonnement est)Votre
operator[]
retours temporaires (valeur r), ce qui fait de chacun de ses membres, un rvalue. La langue interdit l'affectation à une rvalue (pour être précis, l'affectation à une rvalue de non-type de classe), et c'est ce que l'erreur est vous dire.La raison de cette restriction est que, depuis que la gauche sera détruit à la fin de la pleine expression, la cession ne serait pas beaucoup de sens (il sera oublié avec l'entreprise de destruction).
Si vous modifiez l'élément retenu à l'intérieur de la classe, vous avez besoin de retourner une référence (lvalue) à l'stocké élément, plutôt qu'une copie.