Errores de linkado, templates, visual c++

Buenas, estoy haciendo un trabajo para clase, necesito probar empíricamente unos algoritmos, y estoy teniendo problemas de linkado. He creado una clase que hereda de vector (de la STL), y le he añadido algunas funciones más, pero a la hora de compilar me da un error feisimo de linkado, he aqui el código:

Array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_

#pragma once
#include<string>
#include<iostream>
#include<vector>
#define SELECCION 1
#define BURBUJA 2
#define SHELL 3
#define QUICKSHORT 4
#define HEAPSORT 5

using namespace std;



template <typename T>
class Array : public vector<T>{
   void OrdenarSeleccion();
   void OrdenarBurbuja();
   void OrdenarShell() ;
   void OrdenarQuicshort() ;
   void OrdenarHeapsort() ;
   void BuscarLineal()const;
   void BuscarBinaria()const;
   void intercambiar(int pos1, int pos2);
public:
   Array(int capacidad);
   void Ordenar(int tipo);
   bool Buscar(int tipo) const;
};

Array<int> generaAleatorio(int talla);
#endif


Array.cpp
#include "StdAfx.h"
#include "Array.h"
#include <time.h>

template <typename T>
Array<T>::Array(int capacidad):vector<T>(capacidad){
};


template <typename T>
void Array<T>::OrdenarSeleccion(){
   for (int i=0; i<this.size(); i++){
      T minimo=this[i];
      int Pminimo=i;
      for (int k=0; k<this.size();k++){
         if(this[k]<minimo){
            minimo=this[k];
            Pminimo=k;
         }
      }
      intercambiar(i,Pminimo);
      }
}
template <typename T>
void Array<T>::OrdenarBurbuja(){

}
   
template <typename T>
void Array<T>::OrdenarShell(){

}
   
template <typename T>
void Array<T>::OrdenarQuicshort(){

}
   
template <typename T>
void Array<T>::OrdenarHeapsort(){

}
   
template <typename T>
void Array<T>::BuscarLineal()const{

}

template <typename T>
void Array<T>::BuscarBinaria()const{

}

template <typename T>
void Array<T>::Ordenar(int tipo){
   switch (tipo){
   case SELECCION: OrdenarSeleccion(); break;
   default : break;
   }

}

template <typename T>
bool Array<T>::Buscar(int tipo) const{

}

template <typename T>
void Array<T>::intercambiar(int pos1, int pos2){
   T aux;
   aux=this[pos1];
   this[pos2]=this[pos1];
   this[pos1]=aux;
}

Array<int> generaAleatorio(int talla){
   Array<int> a(talla);
   srand(time(NULL));
   for (int i=0; i<talla; i++){
      a[i]=rand()%1000;
   }
   return a;
}


Practica1.cpp
#include "stdafx.h"
#include "Array.h"


int _tmain(int argc, _TCHAR* argv[])
{
   Array<int> a(200);
   for (int i=0; i<200; i++){
      a[i]=i;
   }

   for (int i=0; i<200; i++){
      cout <<a[i]<<endl;
   }
   
   a.Ordenar(0);


   system("pause");


   return 0;
}


Y el error de linkado que me da es: Practica1.obj : error LNK2019: símbolo externo "public: void __thiscall Array<int>::Ordenar(int)" (?Ordenar@?$Array@H@@QAEXH@Z) sin resolver al que se hace referencia en la función _wmain

A ver si me podies echar una mano, Gracias
1) std::vector no está pensada para que heredes de ella. Como verás, no tiene un destructor virtual. No lo hagas.
2) El error de linkado es porque el símbolo 'Ordenar' no está disponible. Básicamente, deberías tener esos templates en el .hpp.

- fer
Una clase template es una plantilla, hasta que no instancias con valores reales sus parametros template (en este caso T) no se genera código real para los componentes de la clase.
O sea que todo el código que tienes en Array.cpp al ser compilado no genera "nada" (entre comillas).
Debes mover todo el código del cpp a un .h o .hpp e incluirlo en el Practica1.cpp
2 respuestas