Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: MFC (Visual C++) ::  damed templates  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Achromat
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.06.2013
Beiträge: 275
Beitrag Achromat Mitglied 13:02:15 15.07.2017   Titel:   damed templates            Zitieren

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:

C++:
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_pair<std::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


Zuletzt bearbeitet von Achromat am 13:03:12 15.07.2017, insgesamt 2-mal bearbeitet
Techel
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.09.2015
Beiträge: 793
Beitrag Techel Mitglied 13:31:12 15.07.2017   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 05.06.2013
Beiträge: 275
Beitrag Achromat Mitglied 14:04:26 15.07.2017   Titel:   thx            Zitieren

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

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15297
Beitrag Martin Richter Moderator 14:10:05 15.07.2017   Titel:              Zitieren

Also
C++:
values_.insert(value, data);

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
Achromat
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.06.2013
Beiträge: 275
Beitrag Achromat Mitglied 14:40:56 15.07.2017   Titel:              Zitieren

Martin Richter schrieb:
Also
C++:
values_.insert(value, data);


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

Benutzerprofil
Anmeldungsdatum: 05.06.2013
Beiträge: 275
Beitrag Achromat Mitglied 14:54:06 15.07.2017   Titel:   na nu            Zitieren

Hi,

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

C++:
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 .
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15297
Beitrag Martin Richter Moderator 16:13:47 15.07.2017   Titel:   Re: na nu            Zitieren

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


:o)

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7127
Beitrag camper Moderator 21:05:18 15.07.2017   Titel:              Zitieren

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 *:
C++:
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.
C++:
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.
C++:
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)));


Zuletzt bearbeitet von camper am 21:34:09 15.07.2017, insgesamt 4-mal bearbeitet
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23460
Beitrag hustbaer Mitglied 23:03:01 15.07.2017   Titel:              Zitieren

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

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7127
Beitrag camper Moderator 23:17:58 15.07.2017   Titel:              Zitieren

hustbaer schrieb:
(data) oder +data sollte auch reichen, oder?
+data habe ich oben schon. Klammern ändern die Wertkategorie nicht.
C++ Forum :: MFC (Visual C++) ::  damed templates  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.