Vorlagen in c ++ verstehen

Ich versuche das folgende Programm auszuführen, aber es erzeugt einen Kompilierungsfehler:

#ifndef TEMPLATE_SUM_H_
#define TEMPLATE_SUM_H_

template<typename T>
class sum
{
  public:
    sum() {
      val_1 = 0;
      val_2 = 0;
    }
    sum(T a, T b) {
      val_1 = a;
      val_2 = b;
    }
    friend std::ostream& operator<<(std::ostream &, const sum<> &);

  private:
    T val_1, val_2;
    T result() const;
};

#endif

Quellendatei:

include <iostream>
#include "inc/sum.h"

template<typename T>
T sum<T>::result() const {
   return (val_1 + val_2);
}

template<typename T>
std::ostream& operator<<(std::ostream& os, const sum<T>& obj) {
//std::ostream& operator<<(std::ostream& os, sum<T>& obj) {
  os << obj.result();
  return os;
}

int main()
{
    sum<int> int_obj(15, 15);
    sum<float> float_obj(5.2, 3.5);
    std::cout << "result of int = " << int_obj << std::endl;
    std::cout << "result of float = " << float_obj << std::endl;
    return 0;
}

Kompilieren mit g ++ (4.4.3) es erzeugt folgenden Fehler:

In file included from template.cpp:2:
inc/sum.h:18: error: wrong number of template arguments (0, should be 1)
inc/sum.h:5: error: provided for ‘template<class T> class sum’
template.cpp: In function ‘std::ostream& operator<<(std::ostream&, const sum<T>&) [with T = int]’:
template.cpp:20:   instantiated from here
template.cpp:5: error: ‘T sum<T>::result() const [with T = int]’ is private
template.cpp:12: error: within this context
template.cpp: In function ‘std::ostream& operator<<(std::ostream&, const sum<T>&) [with T = float]’:
template.cpp:21:   instantiated from here
template.cpp:5: error: ‘T sum<T>::result() const [with T = float]’ is private
template.cpp:12: error: within this context

1) Kann mir jemand bei der Identifizierung des Fehlers helfen? Bitte schlagen Sie auch einige Links vor, auf denen ich kurze absolute Details zur Verwendung von Vorlagen in c ++ finden kann.

2) Ich habe gelesen, dass templatisierte Funktionen / Klassen, die in der Header-Datei deklariert und separat definiert wurden, anfällig für Verknüpfungsfehler sind. Kann mir jemand das erklären / erläutern? Gibt es im obigen Beispiel eine Möglichkeit, Fehler zu verknüpfen?

Die Aussage ist wie folgt:

"Wenn eine Vorlage oder Inline-Funktion in einer .h-Datei deklariert ist, definieren Sie sie in derselben Datei. Die Definitionen dieser Konstrukte müssen in jeder .cpp-Datei enthalten sein, die sie verwendet, oder im Programmkann einige Build-Konfigurationen nicht verlinken. "

Dieses Beispiel kann auf einfachere Weise ohne Verwendung eines überladenen Operators usw. erstellt werden. Ich versuche jedoch, Vorlagen zu lernen / zu üben und einige Funktionen auszuprobieren.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage