símbolo externo no resuelto “público: __thiscall Vector ”

Por lo tanto, he creado un progtwig VC ++ básico y he creado una clase de plantilla con 1 método (además del constructor y el destructor). Estoy recibiendo los siguientes errores:

>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector::~Vector(void)" (??1?$Vector@H@@QAE@XZ) referenced in function _main >main.obj : error LNK2019: unresolved external symbol "public: __thiscall Vector::Vector(int)" (??0?$Vector@H@@QAE@H@Z) referenced in function _main >c:\users\edy\documents\visual studio 2010\Projects\ex01\Debug\ex01.exe : fatal error LNK1120: 2 unresolved externals 

Aquí está mi código:

(Archivo de clase CPP)

 using namespace std; #include "Vector.h" template  Vector::Vector(int n) { this.crt = 0; this.dim = n; this.elem = new T[100]; } template  void Vector::add(T e) { this.elem[crt] = e; this.crt++; } template  Vector::~Vector(void) { this.crt = 0; } 

(Archivo de clase H)

 #pragma once template  class Vector { public: int dim; T* elem; Vector(int n); void add(T e); ~Vector(void); private: int crt; }; 

(Archivo principal)

 using namespace std; #include "Vector.h" int main(void) { Vector x(5); //x.add(1); <--- if i decomment this line, it throws an additional error return 0; } 

La mayoría de las soluciones involucraron métodos no implementados, pero tengo todos mis métodos implementados. No tengo idea de lo que podría estar mal. ¿Alguna ayuda?

La implementación de la clase de plantilla debe ser visible para todas las unidades de traducción que las utilizan. Mueva las implementaciones al archivo de cabecera.

Antes de preguntar, no, no hay forma de ocultarlos, a menos que sepa de antemano qué especializaciones para la clase que tiene. Si desea que su Vector sea ​​genérico, las implementaciones deben ser visibles.

Si desea separarlos, la forma habitual de hacerlo es tener las implementaciones en un archivo .impl que incluya en el encabezado.

Si pretende implementar la plantilla en un archivo .cpp , también deberá proporcionar una instanciación explícita de la plantilla allí. Puedes agregar al archivo .cpp la plantilla:

 class template Vector; 

en el fondo. Esto instanciará una versión int de su plantilla de vector. Pero encontrará que su plantilla es más fácil de usar si sigue los consejos de Luchian. Si hace lo que él sugiere, el comstackdor creará las instancias a pedido para usted a medida que usa Vector<> en diferentes tipos. Si lo deja en un archivo .cpp , deberá agregar una instanciación explícita cada vez que desee crear un tipo diferente de Vector<> .

Algunos piensan que la creación de instancias explícita es más sencilla que implícita, ya que si diferentes conjuntos de archivos de objetos utilizan las mismas instancias de plantilla muchas veces, el comstackdor puede crear tantas instancias. Sin embargo, el enlazador eliminará las instancias duplicadas al final cuando el ejecutable esté enlazado. Aun así, la hinchazón aún persiste si varias bibliotecas compartidas han reutilizado la misma plantilla con los mismos parámetros, a pesar de que el enlazador dynamic la limpiará. Si el tiempo de carga ejecutable es importante, esta puede ser una razón para preferir la creación de instancias explícita. Si tiene un proyecto muy grande, y los tiempos de construcción y enlace son un problema, esto también puede ser una razón para preferir la creación de instancias explícita.

De lo contrario, debe seguir con la creación de instancias implícita.