Übergeben Sie den Iterator als Funktionsparameter

8

Ich versuche eine Funktion zu schreiben, die die Elemente eines Containers summiert. Dieser Container kann Vektor, Liste, Warteschlange usw. sein. Deshalb habe ich Vorlagen ausprobiert.

Leider bekomme ich diesen Fehler:

  

'C' ist keine Vorlage

Quelle:

%Vor%

Was mache ich falsch? Wie sollte ich es beheben?

    
Iter Ator 27.11.2013, 14:12
quelle

2 Antworten

7

Der spezielle Fehler, den Sie bekommen, ist, weil Sie ein Template-Template-Argument benötigen:

%Vor%

Die Standardcontainer haben jedoch normalerweise mehr als nur ein Template-Argument:

%Vor%

und es ist ein bisschen nicht trivial, solche Funktionen richtig zu schreiben. Sie könnten variadische Vorlagenargumente verwenden, oder Sie könnten wie die Standardbibliothek tun, und nur so viel spezialisieren, wie Sie wirklich brauchen:

%Vor%

In Ihrem Fall (indem Sie so tun, als ob Ihr Bedarf nicht schon von der Standardalgorithmusbibliothek abgedeckt ist):

%Vor%

Es gibt einige Unterschiede zu Ihrem ursprünglichen Code:

  • Der neue Code geht nicht davon aus, dass ein Null- oder ein Standardkonstruktor definiert ist ( T s = null; )
  • führt keinen zusätzlichen Iterator ( it )
  • ein
  • verwendet pre-increment
  • löst eine Ausnahme aus, wenn begin == end

Wenn Sie einen init -Parameter hinzufügen, können Sie fast noexcept :

setzen %Vor%

Aber nur fast, weil init += *begin noch werfen könnte.

Wenn Sie eine solche Signatur haben, haben Sie übrigens die Signatur von std::accumulate reproduziert.

    
Sebastian Mach 27.11.2013, 14:20
quelle
14

Sie könnten das Ganze in Form eines Iteratortyps ausdrücken und iterator_traits verwenden, um den value_type zu erhalten:

%Vor%

Im wirklichen Leben verwenden Sie std :: accumulate :

%Vor%     
juanchopanza 27.11.2013 14:14
quelle