damed templates



  • Hi,

    templates ändern sich ständig: Folge den Qaudawelch kann man später nicht mehr kompilieren. So ergibt sich eine Frage für das Übersetzen dieser floske:

    void MM::Property::AddAllowedValue(const char* value, long data)
    {
       values_.insert(make_pair<string, long>(value, data));
       hasData_ = true;
       limits_ = false;
    }
    

    Da kommt die Sinnreiche Meldung:

    Severity Code Description Project File Line Suppression State
    Error C2664 'std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,long> std::make_pairstd::string,long(_Ty1 &&,_Ty2 &&)': cannot convert argument 2 from 'long' to 'long &&' DemoCamera c:\program files\mmdevicekit-win-dev45\mmdevice\property.cpp 50

    Hat jemand eine Idee wie man das konform korrigiert ?

    Vielen Dank für Hinweise
    Karsten



  • Du solltest die Templateargumente für make_pair weglassen oder statt make_pair einfach ein Paar geschweifter Klammern für eine Initialisierungsliste verwenden.



  • Danke Techel,
    werde ich in kürze probieren.
    Grüße aus Preußen
    K.



  • Also

    values_.insert(value, data);
    


  • Martin Richter schrieb:

    Also

    values_.insert(value, data);
    

    Jo Jo Martin danke schön.
    Grüße und Erfolg.
    K.



  • Hi,

    also mit einem bissel Testen hilf am Besten kommt folgendes raus:

    void MM::Property::AddAllowedValue(const char* value, long data)
    {
       values_.insert(make_pair<string, long>(value, (int)data));
       hasData_ = true;
       limits_ = false;
    }
    

    lediglich ein typecast auf (int) lässt es compilierbar machen.

    Die std kann man ja noch akzeptieren unterliegt strenger Beobachtung
    von Millionen, aber wenn man selber anfängt mit templates, dann
    schippst Du Dir dein eigen Grab .



  • Achromat schrieb:

    aber wenn man selber anfängt mit templates, dann
    schippst Du Dir dein eigen Grab .

    🤡



  • Techel schrieb:

    Du solltest die Templateargumente für make_pair weglassen

    lesen und anwenden...

    Abgesehen von seltenen oder idiomatischen Ausnahmen solltest du Funktionstemplates nur dann mit expliziten Templateparametern aufrufen, wenn diese Templateparameter nicht deduziert werden können.
    Was du wirklich erzeugen willst, ist ja ein std::pair, also gibt es sowieso keinen Grund make_pair aufzurufen, wenn du Templateparameter angibst:
    make_pair wurde gerade dazu geschaffen, pairs erzeugen zu können, ohne explizit Templateparameter angeben zu müssen.Mit den Deduction Guides ist make_pair ab C++17 weitgehend überflüssig.

    Technisch *:

    values_.insert(make_pair<string, long&>(value, data));
    

    wäre korrekt, der Templateparameter, den du make_pair mitgeben müsstest (wenn es denn erforderlich wäre), ist nunmal nicht der Templateparameter, der zum pair, das erzeugt werden soll, gehört, sondern der, der erforderlich ist, den Funktionsparamter passend zu machen.

    * ab C++11 - in C++98 hat make_pair eine andere Signatur, was kein Problem ist, weil man make_pair ja nur ohne explizite Templateparameter aufruft.

    Achromat schrieb:

    lediglich ein typecast auf (int) lässt es compilierbar machen.

    Ein typecast auf (long) tut es auch.

    values_.insert(make_pair<string, long>(value, (long)data));
    

    Logisch, wenn man sich die Zeit nimmt, darüber nachzudenken, was ein Cast macht, anstatt pauschal auf Templates zu schimpfen. Man kann denselben Effekt auch auf viele andere Weisen erziehlen, z.B.

    values_.insert(make_pair<string, long>(value, +data));
    values_.insert(make_pair<string, long>(value, data+0));
    values_.insert(make_pair<string, long>(value, data*1));
    values_.insert(make_pair<string, long>(value, false?0:data));
    values_.insert(make_pair<string, long>(value, std::move(data)));
    values_.insert(make_pair<string, long>(value, std::forward<long>(data)));
    


  • (data) oder +data sollte auch reichen, oder?



  • hustbaer schrieb:

    (data) oder +data sollte auch reichen, oder?

    +data habe ich oben schon. Klammern ändern die Wertkategorie nicht.



  • Jaaaa, man sollte nicht versuchen schlau zu sein wenn man sich nicht 100% sicher ist.

    camper schrieb:

    hustbaer schrieb:

    (data) oder +data sollte auch reichen, oder?

    +data habe ich oben schon.

    Hab ich übersehen, sorry.

    camper schrieb:

    Klammern ändern die Wertkategorie nicht.

    Mein Gedächtnis lässt auch langsam nach 😞
    Zur Auffrischung: Was für Stellen gibt es dann wo x vs. (x) nen Unterschied macht?

    • int foo(x); kann als Funktionsdeklaration geparsed werden, int foo((x)); nicht
    • decltype(x) ist T , decltype((x)) ist T&


  • hustbaer schrieb:

    Jaaaa, man sollte nicht versuchen schlau zu sein wenn man sich nicht 100% sicher ist.

    camper schrieb:

    hustbaer schrieb:

    (data) oder +data sollte auch reichen, oder?

    +data habe ich oben schon.

    Hab ich übersehen, sorry.

    camper schrieb:

    Klammern ändern die Wertkategorie nicht.

    Mein Gedächtnis lässt auch langsam nach 😞
    Zur Auffrischung: Was für Stellen gibt es dann wo x vs. (x) nen Unterschied macht?

    • int foo(x); kann als Funktionsdeklaration geparsed werden, int foo((x)); nicht
    • decltype(x) ist T , decltype((x)) ist T&

    Makros:
    FOO(x) - FOO könnte Objekt- oder Funktionsmakro sein
    (FOO)(x) - ignoriert evtl. vorhandenes Funktionsmakro FOO (alternativ nimmt man whitespace, was nicht so leserlich ist)
    oder auch:
    FOO(a,b) zwei vs. FOO((a,b)) ein Argument (wie auch bei Funktionsaufrufen)