Issue title: Error: with linker
 Issue body: i have this file in `include/abin.hpp`
```cpp
#ifndef ABIN_VEC_HPP
#define ABIN_VEC_HPP
namespace Vectorial
{

const int NODO_NULO = -1;

template <typename T>
class Abin
{
public:
  typedef int nodo;
  explicit Abin(int max);
  Abin(const Abin<T> &a);
  Abin<T> &operator=(const Abin<T> &a);
  void insertarRaiz(const T &e);
  void eliminarRaiz();
  void insertarHijoIzquierdo(nodo n, const T &e);
  void insertarHijoDerecho(nodo n, const T &e);
  void eliminarHijoIzquierdo(nodo n);
  void eliminarHijoDerecho(nodo n);
  bool vacio() const { return size == 0; }
  const T &elemento(nodo n) const;
  T &elemento(nodo n);
  nodo raiz() { return (size > 0) ? 0 : NODO_NULO; }
  nodo padre(nodo n) const;
  nodo hijoIzquierdo(nodo n) const;
  nodo hijoDerecho(nodo n) const;
  ~Abin() { delete[] nodos; }

private:
  int max_size;
  int size;
  class celda
  {
  public:
    T elemento;
    nodo padre, h_izq, h_dch;
    celda(const T &elto, nodo p = NODO_NULO, nodo h_d = NODO_NULO, nodo h_i = NODO_NULO) : elemento{elto}, padre{p}, h_izq{h_i}, h_dch{h_d} {}
    celda(const celda &) = default;
    celda &operator=(const celda &) = default;
  };
  celda *nodos;
};
} // namespace Vectorial
#endif
```
and this one in `src/abin.cpp`

```cpp
#include "abin.hpp"
#include <algorithm>
#include <cassert>
template <typename T>
Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in(int max) : max_size{max}, size{0}, nodos{new celda[max]} {}

template <typename T>
Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in(const Abin<T> &a) : nodos{new celda[a.max_size]}, max_size{a.max_size}, size{a.size}
{
    st38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5copy(a.nodos, a.nodos + (a.size - 1), nodos);
}

template <typename T>
void Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5insertarRaiz(const T &e)
{
    assert(size == 0);
    nodos[size++] = celda(e);
}

template <typename T>
void Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5insertarHijoIzquierdo(nodo n, const T &e)
{
    assert(n >= 0 && n < size);
    assert(nodos[n].h_izq == NODO_NULO);
    assert(size < max_size);
    nodos[n].h_izq = size;
    nodos[size++] = celda(e, n);
}

template <typename T>
void Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5insertarHijoDerecho(nodo n, const T &e)
{
    assert(n >= 0 && n < size);
    assert(nodos[n].h_dch == NODO_NULO);
    assert(size < max_size);
    nodos[n].h_dch = size;
    nodos[size++] = celda(e, n);
}

template <typename T>
void Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5liminarHijoIzquierdo(nodo n)
{
    auto h_izq = nodos[n].h_izq;
    assert(n >= 0 && n < size);
    assert(h_izq != NODO_NULO);
    assert(nodos[h_izq].h_izq == NODO_NULO &&
           nodos[h_izq].h_dch == NODO_NULO);
    if (h_izq != size - 1)
    {
        nodos[h_izq] = nodos[size - 1];
        if (nodos[nodos[h_izq].padre].h_izq == size - 1)
            nodos[nodos[h_izq].padre].h_izq = h_izq;
        else
            nodos[nodos[h_izq].padre].h_dch = h_izq;
        if (nodos[h_izq].h_izq != NODO_NULO)
            nodos[nodos[h_izq].h_izq].padre = h_izq;
        if (nodos[h_izq].h_dch != NODO_NULO)
            nodos[nodos[h_izq].h_dch].padre = h_izq;
    }
    nodos[h_izq] = NODO_NULO;
    --size;
}

template <typename T>
void Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5liminarHijoDerecho(nodo n)
{
    auto h_dch = nodos[n].h_dch;
    assert(n >= 0 && n < size);
    assert(h_dch != NODO_NULO);
    assert(nodos[h_dch].h_dch == NODO_NULO &&
           nodos[h_dch].h_izq == NODO_NULO);
    if (h_dch != size - 1)
    {
        nodos[h_dch] = nodos[size - 1];
        if (nodos[nodos[h_dch].padre].h_dch == size - 1)
            nodos[nodos[h_dch].padre].h_dch = h_dch;
        else
            nodos[nodos[h_dch].padre].h_izq = h_dch;
        if (nodos[h_dch].h_izq != NODO_NULO)
            nodos[nodos[h_dch].h_izq].padre = h_dch;
        if (nodos[h_dch].h_dch != NODO_NULO)
            nodos[nodos[h_dch].h_dch].padre = h_dch;
    }
    nodos[h_dch] = NODO_NULO;
    --size;
}

template <typename T>
inline void Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5liminarRaiz()
{
    assert(size == 1);
    size = 0;
}

template <typename T>
inline const T &Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5lemento(nodo n) const
{
    assert(n >= 0 && n < size);
    return nodos[n].elemento;
}

template <typename T>
inline T &Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5lemento(nodo n)
{
    assert(n >= 0 && n < size);
    return nodos[n].elemento;
}

template <typename T>
inline typename Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5nodo Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5padre(nodo n) const
{
    assert(n >= 0 && n < size);
    return nodos[n].padre;
}

template <typename T>
inline typename Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5nodo Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5hijoIzquierdo(nodo n) const
{
    assert(n >= 0 && n < size);
    return nodos[n].h_izq;
}

template <typename T>
inline typename Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5nodo Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5hijoDerecho(nodo n) const
{
    assert(n >= 0 && n < size);
    return nodos[n].h_dch;
}

template <typename T>
Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T> &Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<T>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5operator=(const Abin<T> &a)
{
    if (this != &a)
    {
        if (max_size < a.max_size)
        {
            delete[] nodos;
            max_size = a.max_size;
            nodos = new celda[max_size];
        }
        size = a.size;
        st38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5copy(a.nodos, a.nodos + (a.size - 1), nodos);
    }
    return *this;
}
```
When i call the constructor i getting this error:
```sh
[build] FAILED: main.x 
[build] : && /usr/bin/clang++  -Wall -Wextra -g -O0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/main.x.dir/app/main.cpp.o  -o main.x  libengine.a && :
[build] Undefined symbols for architecture x86_64:
[build]   "Vectorial38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in<int>38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5in(int)", referenced from:
[build]       _main in main.cpp.o
[build] ld: symbol(s) not found for architecture x86_64
[build] clang: error: linker command failed with exit code 1 (use -v to see invocation)
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1
```
and my `app/main.cpp`

```cpp
#include <iostream>
#include "abin.hpp"
using namespace Vectorial;
int main()
{
  Abin<int> A(2);
  st38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5cout << A.vacio() << st38d1:d2b4:3d06:83e8:96a5:8c2:893d:aba5endl;
}
```
 Comments: 
 Comment 0: [Here the repository](https://github.com/krosf-university/ednl)
 Comment 1: Thanks for having a go at using this setup 👍 

This is an inherent issue with the way you have structured your code. In general, you cannot have your _template_ declaration and definition in different compilation units (see e.g. [here](https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl) for an explanation of why this is). You can of course do this for non-template code, but templates are special. 

You'll have to put the implementations inside the .hpp file or try some other way discussed [here](https://stackoverflow.com/questions/115703/storing-c-template-function-definitions-in-a-cpp-file). 
 Comment 2: Thanks, the error has gone.
{'source': 'GithubIssues', 'repo_name_with_owner': 'bsamseth/cpp-project', 'issue_id': 412482391, 'repo_stars': 500.0}