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)
Fehler kommt in Zeile
m_message = custom_message.str();
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.
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.
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.
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:
Tags und Links c++ visual-studio