2009-02-27 4 views
1

Ich arbeite an einem Projekt für die Schule mit Datenstrukturen in Visual C++. Ich habe heute früh meinen Code kompiliert und nahm ihn nach Hause und es funktioniert nicht mehr. Beide Computer, an denen ich gearbeitet habe, verwenden Visual Studio 2008. Hier ist der Text des Fehlers.LNK2005 - Visual Studio - Kompiliert vor gut, keine Änderungen, keine Kompilierung jetzt

Ich bin nicht sicher, ob das etwas damit zu tun haben könnte, aber mein Programm hat 3 Hauptklassen: AVL, die von BST erbt, die von SearchableADT erbt. Dies sind Templates.

BST.obj: Fehler LNK2005: "öffentlich: __thiscall BST, Klasse std :: allocator>> :: BST, Klasse std :: allocator>> (void)" (?? 0? $ BST @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ Zuweiser @ D @ 2 @@ std @@@@ QAE @ XZ) bereits in AVL.obj

definiert Ich bin bei einem kompletten Verlust für was machen. Ich habe in ein paar Foren gestöbert, die MSDN-Seite angeschaut und nichts konnte es beheben.

Eine Sache, die ich bemerkte erwähnt auf einer Website, die ich vergessen hatte, war # ifndef/# definieren für meine AVL. Ich habe ein neues Projekt erstellt und meinen gesamten Code mit diesem Zusatz kopiert und eingefügt und erhalte immer noch den gleichen Fehler. Ich habe meinen Code überprüft, um zu überprüfen, dass ich nicht mehrere Includes von Bibliotheken verwende. Ich weiß nicht, was ich von hier aus tun soll.

Vielen Dank für jede Hilfe, die Sie zur Verfügung stellen können, und Entschuldigung im Voraus, wenn ich etwas Wichtiges weggelassen habe.

Edit: Ich bin mir nicht 100% sicher, was Sie mit Inline meinen, versuchen, einige suchen jetzt. Ich habe eine separate cpp, wo ich die eigentlichen Funktionen definieren. Würde das Inline-Ding in Gregs Antwort immer noch zutreffen?

MSN, ich fürchte, ich habe deine Antwort nicht verstanden. Wie für mehrere Kopien des Standardkonstruktors, habe ich

BST<int>::BST() 
{ 
    root = new Node<int>; 
} 

BST<string>::BST() 
{ 
root = new Node<string>; 
} 

Ich bin mir nicht sicher, ob das, was Sie redeten, oder wenn das könnte das Problem sein. Meine Header-Datei hat nur BST() ;, nichts für die int oder String-Vorlage. Ich habe diese Definitionen in meinem cpp, weil mein Ausbilder sagte, dass sie für die Vorlagenklasse notwendig waren.

Vielen Dank

Antwort

0

Declare BST :: BST (void) inline und stellen Sie sicher, dass Sie nicht der Definition Regel verstößt und haben unterschiedliche Implementierungen von BST :: BST (void) in Abhängigkeit von einem anderen Präprozessor Spaß.

1

Es klingt, als ob Sie eine Methode in einer Header-Datei nicht-inline definiert haben. Zum Beispiel in einer Header-Datei, die die folgenden Eigenschaften könnte ein solches Problem verursachen:

template <class T> class Foo { 
    void bar(); 
}; 

template <class T> void Foo<T>::bar() 
{ 
    // ... 
} 

Damit in der Header-Datei, dann ist es in zwei verschiedenen Modulen einschließlich werden zwei verschiedene Definitionen der gleichen Foo<T>::bar() Funktion zur Verfügung stellen, mit der resultierender Fehler, den Sie bekommen haben. Eine Lösung ist die Funktion inline zu deklarieren:

template <class T> class Foo { 
    void bar() { 
     // ... 
    } 
} 
1

Sie keinen separaten Konstruktor für jede instanziiert Art der Vorlage definieren. Sie benötigen nur einen Konstruktor für BST. Sie können eine Instanz der Knotenklasse mithilfe des Vorlagenparameters erstellen:

Verwandte Themen