Comprender las plantillas en c ++

Estoy intentando ejecutar el siguiente programa, pero genera un error de compilación:

#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

Archivo fuente:

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;
}

Compilando cong ++ (4.4.3) genera el siguiente error:

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) ¿Alguien puede ayudarme a identificar el error? También sugiera algunos enlaces donde pueda encontrar breves detalles absolutos sobre cómo usar plantillas en c ++.

2) Leí que las funciones / clases con plantilla declaradas en el archivo de encabezado y definidas por separado son propensas a errores de enlace. ¿Alguien puede explicar / elaborar esto? ¿Hay alguna posibilidad de error de enlace en el ejemplo anterior?

La declaración es la siguiente:

"Si se declara una plantilla o función en línea en un archivo .h, defínalo en ese mismo archivo. Las definiciones de estas construcciones deben incluirse en cada archivo .cpp que las use, o en el programapuede fallar al enlazar en algunas configuraciones de compilación".

Este ejemplo se puede hacer de una manera más fácil, sin usar un operador sobrecargado, etc. Pero estoy tratando de aprender / practicar plantillas y experimentar algunas características.

Respuestas a la pregunta(2)

Su respuesta a la pregunta