LNK2001: unresolved external symbol

0

Witam

Mam otóż mam problem z linkerem VC++ 2010
Stworzyłem plik o nazwie np. XXX.hpp, a w nim klase DynArray:

template<class X> class DynArray
//tablica dynamiczna o wbudowanym alokatorze
//zawiera szereg funkcji zarzadzajacych tablica
//a takze zwykle operatory, by moc
//zarzadzac ta tablica jak wbudowanym typem
{
private:

	X* Data; //tablica wlasciwa
	
	X Empty; //pusty
	
	Uint Capacity, //ilosc elementow
		 Size; //rozmiar
		 
	bool IsSort, //czy posortowana
		 IsClean; //czy czysta

public:

	DynArray(const Uint StartSize);
	DynArray(const Array<X>& Ref);
	DynArray(const DynArray<X>& Ref);
	
	~DynArray();
	
	Uint Length();
	Uint High();
	Uint GetSize();
	
	void Clear(); //czysci tablice
	
	X& operator[] (const Uint Index);
};
 

A tu z pliku XXX.cpp zawarłem definicje metod z klasy DynArray:

#include "XXX.hpp"
template<class X>
DynArray<X>::DynArray (const Uint StartSize)
{
	Capacity = StartSize;
	Data = new X[Capacity];
	Size = (sizeof(X)*Capacity);
	IsSort = false;
	IsClear = false;
};

template<class X>
DynArray<X>::DynArray (const DynArray<X>& Ref)
{
	memcpy(Data, Ref.Data);
};

template<class X>
DynArray<X>::DynArray (const Array<X>& Ref)
{
	memcpy(Data, Ref.Data);
};

template<class X>
DynArray<X>::~DynArray()
{
	Clear();
};

template<class X>
void DynArray<X>::Clear()
{
	if (Data != NULL)
	{
		delete [] Data;
		Data = NULL;
	} else return;
};

template<class X>
X& DynArray<X>::operator[] (const Uint Index)
{
	if (Data != NULL)
		return Data[Index];
	else
		return NULL;
};

template<class X> 
Uint DynArray<X>::Length()
{
	return Capacity;
};

template<class X> 
Uint DynArray<X>::High()
{
	return (Capacity-1);
};

template<class X> 
Uint DynArray<X>::GetSize()
{
	return Size;
};

 

niby wszytsko wygląda dobrze w pliku main.cpp

#include <iostream>
#include <conio.h>
#include "E:\CSE 1\Resoruces\XXX.hpp"

using namespace std;

int main()
{
	DynArray<int> ArrayTest(349);
	ArrayTest[123] = ArrayTest.Length();
	cout << ArrayTest.Length();
	getch();
};

 

Lecz linker wywala przykładowy błąd:

error LNK2001: unresolved external symbol "public: int & __thiscall DynArray<int>::operator[](unsigned int)" (??A?$DynArray@H@@QAEAAHI@Z)

Pytanie: Czy w XXX.cpp jest coś źle, czy linker wariuje?

1

Szablony trzeba tworzyć w pliku nagłówkowym - definicja i ciało. Nie można szablonów dzielić jak zwykłych klas na *.h i *.cpp. Teoretycznie może być to możliwe, lecz wymaga poczytania dokumentacji kompilatora ale nie jest to zalecane.

0

Na moje oko to problem z const Uint
X& DynArray<X>::operator[] (const Uint Index)

W komunikacie wyraźnie masz, że szuka wersji z parametrem bez const...

Jeszcze mały hit, nie związany z tym problemem: tym memcpy przy kopiowaniu uniemożliwiasz wykonanie konstruktora kopiującego obiektu X. memcpy to fajna rzecz, ale w C, w C++ niestety wypadałoby, aby jednak kontener obsługiwał konstruktory kopiujące obiektów :>

0
Hostel napisał(a):

Szablony trzeba tworzyć w pliku nagłówkowym - definicja i ciało. Nie można szablonów dzielić jak zwykłych klas na *.h i *.cpp. Teoretycznie może być to możliwe, lecz wymaga poczytania dokumentacji kompilatora ale nie jest to zalecane.

Szkoda, bo chciałbym właśnie tak dzielić te szablony tych klas. Jednakże, jeżeli się nie da, a VC pewnie nie dostarcza takiego mechanizmu (jeżeli jest inaczej, może kiedyś poszukam sobie i poczytam o tym), to lipa niestety. W każdym razie dziękuję za poradę ;) .

1 użytkowników online, w tym zalogowanych: 0, gości: 1