C++ runterbrechen von nested variant

Hallo cwriter,

ich glaube ich habe mit Deiner Hilfe das Problem beheben können.
Ich habe mir den englischen Text mal näher angeschaut.
Dort stand was mit BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
und genau diese Buchstaben/Anweisung, habe ich oberhalb von den Headern
als #define mit in den Quelltext eingebunden und siehe da, er compiliert und führt
ohne Exception aus.

Danke für Deine Hilfe
Ich markier den Thread hier mal als erledigt.

Gruß
Jens
 
Dort stand was mit BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT
Recomendation: Use get in new code without defining BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT. In that way get provides more compile time checks and it's behavior is closer to std::get from C++ Standard Library.
Geht natürlich auch, aber einfach nur Tests deaktivieren ist wie Warnungen abschalten: In erster Line löst es das Problem, in zweiter hat man sehr viel grössere Probleme.
Allerdings weiss ich hier echt nicht, warum es sich beschwert, wenn das, worüber es sich beschwert (meines Erachtens) nicht zutrifft. Allerdings sind template-Errors ja immer dieses Gemüse, daher kann ich da schon was übersehen haben.
dieser Typus U wie ist der definiert?
Der Typ U ist das Template-Argument von add_pointer, welches den Typ vom template-argument von get übernimmt. strict_get.

Gruss
cwriter
 
so, Nachtrag:

ich erhalte im ersten operator =

Code:
parser_sbase.cc:235:48: Fehler: »kallup::expression kallup::operator=(kallup::TypeDouble<int>&)« muss eine nichtstatische Elementfunktion sein
     expression operator = (TypeDouble<int> &val) {
                                                ^

mit diesem Code:

Code:
    expression operator = (TypeDouble<int> &val) {

    }

    expression operator = (
           const  cmd_varset<TypeDouble<int>> &lhs,
           const boost::recursive_wrapper<cmd_varset<TypeDouble<int>>> &rhs) {
        lhs.value = rhs.get();
    }

    expression operator + (expression &exp1, expression const &exp2) {
        std::cout << "plus" << std::endl;

        auto *tmp1 = boost::get<boost::recursive_wrapper<cmd_varset<TypeDouble<int>>>>(&exp1);
        auto *tmp2 = boost::get<boost::recursive_wrapper<cmd_varset<TypeDouble<int>>>>(&exp2);

        cmd_varset<TypeDouble<int>> ex1; ex1 = tmp1;
        cmd_varset<TypeDouble<int>> ex2;

        TypeDouble<int> *rend1 = &ex1->value;
        TypeDouble<int> *rend2 = &ex2->value;

        double er1 = rend1->value;
        double er2 = rend2->value;

        double res = er1 + er2;
        exp1 = res;
        std::cout << "cmd_set: " << res << std::endl;
        return exp1;
    }
 
tja expression ist doch eine klassenähnliches Objekt
ein variant template.
Und jetzt? Wie soll der =-Operator denn funktionieren?

Dein Code müsste etwa so aufgerufen werden:
C:
=(tval);
Ja was soll denn gleichgesetzt werden?

(Übrigens ist cmd_varset::eek:perator=() auch ungewöhnlich: Du setzt nichts, sondern erstellst ein neues Objekt. [typ] operator=([param]) bedeutet nicht, dass man es als "[typ] a = b" nutzen kann, sondern dass eine Instanz der Klasse, in der operator=() genutzt wird, diesen Rückgabetyp hat.
Normalerweise sollte also operator=() sowas wie "return *this;" als Rückgabestatement haben, um sowas wie "a = (b = c)" zu erlauben ("b = c" evaluiert zu c, sodass das entstehende "a = c" auch zu "c" evaluiert.

Jedenfalls: Da du im Falle von Expression die Klasse nicht selbst gebaut hast, kannst du die Interna ja nicht kennen. Einen operator=() zu überladen macht somit keinen Sinn.

Gruss
cwriter

/EDIT:
Du meinst wohl sowas wie friend operator=(a, b).
(Weiss nicht, ob das geht, müsste aber).
Allerdings hat recursive_wrapper schon einen operator=() - Overload, der genau das macht, was du willst...
 
Zuletzt bearbeitet:
Hm

1) Warum verweigerst du dich den visitors? Ich kann mir gut vorstellen, dass die das Ganze sehr viel einfacher machen würden.
2) Der Compiler sagt dir ja, was ihm nicht passt:
Code:
error: no matching function for call to 'kallup::TypeDouble<int>::TypeDouble(boost::recursive_wrapper<kallup::cmd_varset<kallup::TypeDouble<int> > >&)'
TypeDouble hat keinen entsprechenden Konstruktor. Entweder die Werte aus recursive_wrapper und cmd_varset in der richtigen Reihenfolge extrahieren oder einen Konstruktor dafür bauen. Die anderen Fehler sind zumindest grösstenteils Folgen davon.
3) Es ist für andere später schwer nachzuvollziehen, was der Code eigentlich war, wenn die externe Datei, aus welchen Gründen auch immer, nicht erreichbar ist. Das Kopieren des Codes hierhin mag zwar ein bisschen aufwendiger sein, allerdings wäre das dann auch ein Ansporn, diese kleinen (und vom Compiler vergleichsweise gut erklärten) Fehlerchen selbst zu beheben...

Gruss
cwriter
 
Zurück