Fehler C2678: binary '=': kein Operator gefunden, der einen linken Operanden vom Typ 'const std :: string' verwendet (oder es gibt keine akzeptable Konvertierung)

8

Ich bin wirklich verwirrt darüber, warum ich folgenden Kompilierungsfehler bekomme. Microsoft Visual Studio-Compiler.

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)

%Vor%

Fehler kommt in Zeile m_message = custom_message.str();

    
Avinash 11.08.2011, 06:20
quelle

4 Antworten

20

Sie deklarieren die Methode als const

%Vor%

, aber dann versuchen Sie, das Objekt zu ändern

%Vor%

, damit Sie einen Fehler erhalten.

Was Sie stattdessen tun sollten, ist die benutzerdefinierte Nachricht im Konstruktor zu konstruieren.

%Vor%

Ich habe auch Ihren Code geändert, um die std :: string als Referenz zu übergeben, was gängige Praxis ist.

    
john 11.08.2011, 06:24
quelle
3

Sie versuchen, MyException::m_message in einer const-qualifizierten Methode MyException::what() zuzuweisen. Innerhalb solcher what() der gesamten *this Objekt wird als const , was bedeutet, dass m_message Mitglied ebenfalls% beträgt co_de%. Sie können nicht alles auf ein const qualifizierte const Objekt zuweisen, da std::string 's Zuweisungsoperator einen änderbaren erfordert (d.h. eine nicht-const eins) Objekt auf der linken Seite. Sie liefern ein std::string eins.

Wenn Sie wirklich in der Lage sein wollen, die const innerhalb m_message zu ändern, können Sie es als what() Mitglied der Klasse erklären sollte (in diesem Fall scheint es eine gute Idee zu sein). Oder verwenden Sie einen anderen Ansatz.

Wie @John erwähnt, in Ihrem speziellen Fall ist es sinnvoller, um tatsächlich mutable im Konstruktor zu bauen, anstatt sie bis m_message verschieben. Ich verstehe nicht wirklich, warum du deine what() bei jedem Aufruf von m_message sogar neu erstellen möchtest. Es sei denn, Ihr what() erwartet irgendwie von einem Aufruf zu ändern, um ein anderes zu m_line , es gibt wirklich keine Notwendigkeit, es jedes Mal zu tun.

    
AnT 11.08.2011 06:24
quelle
1

Zusätzlich zu den anderen Antworten;

Sie fügen den Header <string> nicht ein, was später die Ursache eines Problems sein kann.

Etwas, das mir sehr geholfen hat, ist, dass einige std:: -Kopfzeilen andere enthalten, was Ihnen erlaubt, eine Klasse zu benutzen, aber vielleicht nur mit eingeschränkter Funktionalität, weil die std:: -Kopfzeilen die -Krone sind Minimum , das für die Ausführung dieser Datei benötigt wird. Das ist ziemlich ärgerlich, denn manchmal deklariert man eine std:: -Klasse wie string , und Sie haben die Kopfzeile nicht eingefügt, die Definition wird in Ordnung sein, aber alles andere kann funktionieren oder nicht - was zu einer Menge Fehlersuche führt Die Definition hat gut funktioniert.

    
Schnommus 11.08.2011 06:28
quelle
0

Sehen Sie sich die Deklaration der Funktion what() an, sie wird als const (die zweite const in der Zeile) markiert. Das bedeutet, dass es keine Membervariablen ändern kann, in Ihrem Fall die Zeichenfolge m_message . Deshalb erhalten Sie den Fehler.

Wie reparierst du es jetzt?

Ihr Code ist falsch, Ihre Funktion what() wird den Text "Parsing Error occured at " usw. bei jedem Aufruf der Funktion what() voranstellen. Anstatt also das m_message -Member ändern zu müssen, schlage ich vor, dass Sie die gesamte Nachricht im ctor der Klasse formatieren:

%Vor%     
wilx 11.08.2011 06:36
quelle

Tags und Links