Nicht aufgelöstes externes Symbol

EntonH

Grünschnabel
Hallo,

ich bin gerade dabei mir eine DLL zu schreiben, innerhalb welcher ich n Objekte einer Klasse X erzeugen will und in einem Klassenarray ablegen, um später auf die Objekte zuzugreifen.

Ich habe mir jetzt folgende Array-Klasse (inspieriert durch den Beitrag in einem anderen Forum) geschrieben:
Code:
//////////////////////////////////////////////////////////////////////////////////
//Datei: hardwareTypArray.h
//
//////////////////////////////////////////////////////////////////////////////////
#pragma once
#include ".\hardwareTyp.h"

#define MAX_NO_OF_CHANNELS 256

template <class hardwareTyp>
class hardwareTypArray
{
	public:
		hardwareTypArray(int size = MAX_NO_OF_CHANNELS);
		hardwareTypArray(const hardwareTypArray& temp);
		~hardwareTypArray();
		hardwareTyp& operator[](int index);
		const hardwareTyp& operator[](int index) const;
		const hardwareTypArray& operator=(const hardwareTypArray &vKa);
		
		int getSize();
		void grow(int newSize);

	private:
		hardwareTyp *vK_arr;
		int arr_size;					
};
/////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
//Datei: hardwareTypArray.cpp
//
//////////////////////////////////////////////////////////////////////////////////
#include ".\hardwareTypArray.h"

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
hardwareTypArray<hardwareTyp>::hardwareTypArray(int size)	
{	
	arr_size = size;
    vK_arr=new hardwareTyp[arr_size];
	for(int i=0;i<arr_size;i++)
		vK_arr[i] = NULL;
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
hardwareTypArray<hardwareTyp>::hardwareTypArray(hardwareTypArray const &temp)
{	
	arr_size = temp.getSize();
	vK_arr = new hardwareTyp[arr_size];
	for (int i = 0; i<arr_size; i++)
		vK_arr[i] = temp[i];
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
hardwareTypArray<hardwareTyp>::~hardwareTypArray()
{
	delete [] vK_arr;
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
int hardwareTypArray<hardwareTyp>::getSize()
{
      return arr_size;
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
void hardwareTypArray<hardwareTyp>::grow(int newSize)
{
	// Diese Methode legt ein neues Array der neuen Größe an, 
    hardwareTyp *newData=new hardwareTyp[newSize];
    // kopiert dann alle Werte des alten Arrays in das neue Array, 
    for(int i=0;i<arr_size;++i)
		newData[i]=vK_arr[i];
    // löscht das alte Array 
    delete[] vK_arr;
    // und setzt dann die Attribute m_size und m_data auf die neuen Werte.
    arr_size=newSize;
    vK_arr=newData;
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
hardwareTyp& hardwareTypArray<hardwareTyp>::operator[](int index)
{
	if(index < 0 || index >= MAX_NO_OF_CAN_CHANNELS)
	{
		cerr << "Array hardwareTyp: Out of Range!" << endl;
		exit(1);
	}
	return vK_arr[index];
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
hardwareTyp const& hardwareTypArray<hardwareTyp>::operator[](int index) const
{
	if(index < 0 || index >= MAX_NO_OF_CAN_CHANNELS)
	{
		cerr << "Array hardwareTyp: Out of Range!" << endl;
		exit(1);
	}
	return vK_arr[index];
}
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
template <class hardwareTyp>
const hardwareTypArray<hardwareTyp>& hardwareTypArray<hardwareTyp>::operator=(const hardwareTypArray &vKa)
{
   if (this == &vKa)
      return *this;
   delete [] vK_arr;
   arr_size = vKa.getSize();
   vK_arr = new hardwareTyp[arr_size];
   for (int i = 0; i<arr_size; i++)
      vK_arr[i] = vKa[i];
   return *this;
}
//////////////////////////////////////////////////////////////////////////////////

Innerhalb einer weiteren Klasse instanziiere ich meine Arrayklasse wie folgt
hardwareTypArray <hardwareTyp> vK_arr; ,
lege Objekte im Array ab
Code:
(vK_arr[i] = *myhardwareTyp;)
und
greife auf diese Elemente zu:
Code:
retVal = vK_arr[i].start();

Wenn ich mir aus meinem ganzen Projekt jetzt eine DLL erstellen lassen möchte,
bekomme ich für jede Funktion meiner Arrayklasse den error LNK2019: Nicht aufgelöstes externes Symbol.

Kann mir jemand weiterhelfen, woran das liegen könnte?
(Die Includes müssten alle richtig gesetzt sein)

Viele Grüße
EntonH
 
Zuletzt bearbeitet:
Hi.

Du kannst nicht so einfach template Code in eine DLL packen, da grundlegend der Code des Templates welches du irgendwo außerhalb der DLL verwenden möchtest, während der Kompilation verfügbar sein muss. Du könntest die Templates schon vorab instanzieren, aber damit bist du nicht wirklich flexibel sondern sparst dir im Grunde nur die Tipparbeit...

Schau mal hier: http://www.tutorials.de/forum/c-c/266528-klassentemplate-funktion-implementieren.html

Gruß
 

Neue Beiträge

Zurück