Hi,
ich hab einen Container-Typ als Template Parameter (C) übergeben und dabei festgestellt, dass er im Template das "const" in "const C::reference" nicht erkennt / merkt. D.h. ich bekomme dann einen Fehler "cannot convert argument 2 from const int to int&"
Gelöst habe ich das indem ich anstelle von "const C::reference" "C::const_reference" verwende, ich würde nur gerne wissen warum das so ist, da ich meinen Fehler nicht erkenne oder gar verstehe! Ich habe das auf gut Glück probiert und es hat geklappt, aber es war ein reiner Versuch und nicht darauf begründet, dass ich gewusst hätte was das Problem ist.
TL;DR;
2 Dinge die ich nicht verstehe:
(1) Warum funktioniert const C::reference nicht, aber C::const_reference schon
(2) Warum will der Compiler von "const int" nach "int&" konvertieren, müsste der Ausgangstyp nicht bereits "const int&" sein (also auch mit Reference?)
Hier noch der Beispiel Code:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
|
template <typename R, typename C>
R do_something(const C& c) {
return std::accumulate(std::begin(c), std::end(c), R(),
[](const R& a, const C::reference b) { return a + b; });
}
// Aufruf:
std::vector<int> vec = { 1, 2, 3 };
do_something<int, std::vector<int> >(vec);
|
Vielen Dank schonmal.