Ich habe eine Funktion Vorlage, die eine std::pair
sowie einen Wert von einem der Typen des Paares dauert. Ich möchte diese Funktion mit einem Eintrag von std::map
als Paar-Argument aufrufen.Wie const/nicht-Const Konflikt in Vorlage Argument Abzug
#include <map>
#include <utility>
template <typename T1, typename T2>
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
// Imagine that this does something important...
}
int main() {
std::map<int, float> foo { { 0, 0.0 } };
do_stuff(*foo.begin(), 0);
}
Dies nicht kompilieren, weil die Art der Eintragung der Karte std::pair<const int, float>
ist, so dass der Typ Abzug für T1
hat widersprüchliche Typen: const int
über das pair
Argument und int
über das val
Argument.
test.cc: In function ‘int main()’:
test.cc:12:27: error: no matching function for call to ‘do_stuff(std::pair<const int, float>&, int)’
do_stuff(*foo.begin(), 0);
^
test.cc:5:6: note: candidate: template<class T1, class T2> void do_stuff(const std::pair<_T1, _T2>&, const T1&)
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
^~~~~~~~
test.cc:5:6: note: template argument deduction/substitution failed:
test.cc:12:27: note: deduced conflicting types for parameter ‘const T1’ (‘const int’ and ‘int’)
do_stuff(*foo.begin(), 0);
^
Was ist der beste Weg, um diesen Konflikt zu lösen? Idealerweise würde ich gerne T1
als int
herleiten, aber es ist in Ordnung, wenn es const int
ist, wenn das einfacher zu implementieren ist.
Ich habe festgestellt, dass ich den Fehler, indem Sie entweder std::remove_const
oder std::decay
von der Art des val
Parameter auflösen kann:
void do_stuff(std::pair<T1, T2> const &pair, typename std::remove_const<T1>::type const &val) {
aber ich weiß nicht, von denen, die besser geeignet ist, oder wenn Es gibt eine andere Lösung, die besser wäre.
nicht sicher zu verstehen ... warum definieren Sie nicht 'do_stuff()' entsprechend; Ich meine 'Vorlage void do_stuff (Std :: Paar const & Paar, T1 const & val)'? –
max66
@ max66, ich will es auch mit Paaren arbeiten, deren erster Typ * nicht * const ist. (Da der ganze Parameter von const referenz übergeben wird, ist die constance der Mitglieder des Paars irrelevant; entweder const oder non-const sollte für beide erlaubt sein.) – Wyzard
Haben Sie versucht, in der Karte eine Konstruktion zu erstellen? Ich meine 'std :: map foo {{0, 0.0}};' –
mtb