Ich Verknüpfung Fehler des folgenden Typs erhalten:Wurf Beifang Ursache Verknüpfung Fehler
$Festival.obj: error LNK2019: nicht aufgelöstes externes Symbol „public: Leere __thiscall Baum :: add (Klasse Preis &)“ (? hinzufügen @? $ Baum @ vPrice @@@@ QAEXAAVPrice @@@ Z) in Funktion verwiesen __catch $? AddBand @ Festival @@ QAE? AW4StatusType @@ HHH @ Z 0
Ich dachte immer, es hat mit Try-Catch-Mechanis zu tun m, aber seitdem anders erzählt worden. Dies ist eine aktualisierte Version der Frage.
Ich verwende Visual Studio 2008, aber ich habe ähnliche Probleme in g ++.
Der entsprechende Code:
In Festival.cpp
#include "Tree.h"
#include <exception>
using namespace std;
class Band{
public:
Band(int bandID, int price, int votes=0): bandID(bandID), price(price), votes(votes){};
...
private:
...
};
class Festival{
public:
Festival(int budget): budget(budget), minPrice(0), maxNeededBudget(0), priceOffset(0), bandCounter(0){};
~Festival();
StatusType AddBand(int bandID, int price, int votes=0);
...
private:
Tree<Band> bandTree;
...
};
StatusType Festival::AddBand(int bandID, int price, int votes){
if ((price<0)||(bandID<0)){
return INVALID_INPUT;
}
Band* newBand=NULL;
try{
newBand=new Band(bandID,price-priceOffset,votes);
}
catch(bad_alloc&){return ALLOCATION_ERROR;}
if (bandTree.find(*newBand)!=NULL){
delete newBand;
return FAILURE;
}
bandTree.add(*newBand);
....
}
In Tree.h:
template<class T>
class Tree{
public:
Tree(T* initialData=NULL, Tree<T>* initialFather=NULL);
void add(T& newData);
....
private:
....
};
Interessanterweise habe ich nicht Verknüpfung Fehler, wenn ich versuche Baum-Funktionen zu nutzen wenn Typ T ein primitiver Typ wie ein int ist.
Hinzugefügt die Verwendung von Tree :: add, es ist direkt am Ende des Festival-Segments. Ja, es gibt Tree.cpp, und es # enthält Tree.h " –
Tree hinzufügen ist in der Tat nicht in der Kopfzeile. Es ist in Tree.cpp, die # Tree.h enthält. Können Sie erklären, warum diese Art von Sache (Schreiben Klasse .h, Class.cpp, und dann #incliude "Class.h" verwenden) ist für keine Template-Klassen/Funktionen in Ordnung, aber funktioniert nicht mit Template-Funktionen? Was macht es nicht sichtbar? –
Fast alle vorhandenen C++ - Compiler erfordern die beiden Deklaration und die Definition von Templates, die vom Compiler zu sehen sind - dh es gibt keine Verknüpfungsstufe für Templates. Sie müssen die Funktionsdefinitionen in die Header-Datei schreiben. –