Ich habe versucht, eine Funktion zu machen, die alle Elemente eines std::vector
fasst:C++ Art von dereferenzierte Iterator
template<typename IteratorT>
auto sum(IteratorT first, IteratorT last) -> decltype(*first) {
decltype(*first) sum = 0;
for (; first != last; ++first)
sum += *first;
return sum;
}
und ich habe diesen Fehler:
cannot convert from 'int' to 'int&'
Dann, nach einigen Recherchen ich diese gefunden: std::iterator_traits<IteratorT>::difference_type
. Geändert meinen Code:
template<typename IteratorT>
auto sum(IteratorT first, IteratorT last) -> typename std::iterator_traits<IteratorT>::difference_type {
std::iterator_traits<IteratorT>::difference_type sum = 0;
for (; first != last; ++first)
sum += *first;
return sum;
}
und es hat funktioniert, aber ich bin nicht sicher, warum, und wenn es eine gute Lösung ist oder nicht. Abschließend habe ich zwei Fragen:
1) Warum decltype(*first)
kehrt int&
und nicht int
wie erwartet ich
2) Was genau typename
vor std::iterator_traits<IteratorT>::difference_type
funktioniert und warum sum
Funktion funktioniert nicht, wenn ich es entfernen
Ich hoffe, Sie tun dies nur als Übung, denn wir haben bereits ['std :: accumulate'] (http://en.cppreference.com/w/cpp/algorithm/accumulate). –
Ja, ich weiß. Ich versuche nur, mehr über Iteratoren zu lernen. – DimChtz
In C++ 14, entfernen Sie einfach '-> declltype (* zuerst)'. In C++ 11 müssen Sie entweder 'declltype' besser verstehen oder einfach einen echten Return-Typ verwenden (nämlich' std :: iterator_traits :: value_type'). Ersetzen Sie auch 'declltype (* first) sum 'mit diesem Typ. –