'=' : Linker operand muss l-Wert
Wenn ich kompilieren Sie den folgenden code, habe ich "error C2106: '=' : Linker operand muss l-Wert" auf "m.msg_body[i].id = i;". Wenn ich den Kommentar aus dieser Zeile, es ist nicht Fehler. Was ist falsch an meinem 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";
}
}
InformationsquelleAutor Lwin Htoo Ko | 2012-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
operator[]
gibt, die von Wert, was bedeutet, dass es eine temporäre Kopie zurückgegeben. Provisorien sind rvalues. Sie sollten ändern Sie Ihren Netzbetreiber für die Rückgabe einer Referenz. Eigentlich sollte man zwei Versionen, eine const-version, die gibt eine const-Referenz, und eine non-const-version, die gibt einen nicht-const-Referenz.Ihre Methode im Umgang mit einer out-of-range-index wird zu ändern aber. Sie können entweder eine exception zu werfen, oder lassen Sie es einfach als Undefiniertes Verhalten, nur sicher sein, um es zu dokumentieren. Eine andere option wäre, einen dummy
MsgBodyData
Objekt in der Klasse, dass Sie zurückkommen, wenn Sie einen schlechten index, aber das scheint ein sehr dummes design.wenn Sie eine Ausnahme auslösen, müssen Sie nicht etwas zurückzugeben.
Wie können Sie Ihre
MsgBodyData
umgewandelt werden zu NULL? Selbst wenn es könnte, das wäre auch noch ein rvalue. Nachdem eine Ausnahme? Es würde keinen Punkt geben, da die return-Anweisung nie erreicht würde.Aber, warum "m.msg_body[i].value = "test_value";" hat keine Fehler???
Da
value
ist der Typstd::string
. Eine Klasse, sondern als eine gebaut. Es ist möglich (aber nicht empfohlen) schreiben Sie einen Zuweisungsoperator für eine Klasse, hat einige Nebenwirkungen, andere als die Zuweisung an das Objekt. In diesem Fall ist die Zuordnung zu einem rvalue könnte Sinn machen. Anstatt dass die compiler-Analyse der Zuweisungs-operator für Nebenwirkungen wie diese, ich denke, das standards Komitee beschloss einfach, dass es über das Brett. (Das ist eine Vermutung, ich weiß wirklich nicht, was den standards committee ' s Argumentation war)InformationsquelleAutor Benjamin Lindley
Ihre
operator[]
gibt eine temporäre (rvalue), das macht jedes Ihrer Mitglieder eine rvalue. Die Sprache verbietet die Zuweisung an einen rvalue (um genau zu sein, die Zuordnung zu einem rvalue of non-class type), und das ist, was der Fehler ist Ihnen zu sagen.Der Grund für diese Einschränkung ist, dass seit der linken Seite, zerstört am Ende des vollständigen Ausdrucks, die Zuordnung würde nicht viel Sinn (es wird vergessen sein, mit der zeitweiligen Zerstörung).
Wenn Sie also zu ändern, das element, die statt in die Klasse, müssen Sie für die Rückgabe einer Referenz (lvalue), um die gespeicherten element, anstatt einer Kopie.
InformationsquelleAutor David Rodríguez - dribeas