2009-02-27 12 views
1

Je travaille sur un projet pour l'école avec des structures de données dans Visual C++. J'ai compilé mon code très bien plus tôt aujourd'hui, et je l'ai ramené chez moi et ça ne marche plus. Les deux machines sur lesquelles j'ai travaillé utilisent Visual Studio 2008. Voici le texte de l'erreur. Je ne suis pas sûr si cela puisse avoir quelque chose à voir avec cela, mais mon programme a 3 classes principales: AVL, qui hérite de BST, qui hérite de SearchableADT. Ce sont des classes modélisées.LNK2005 - Visual Studio - Compilé avant fin, pas de modifications, ne pas compiler maintenant

BST.obj: erreur LNK2005: "public: __thiscall BST, classe std :: allocateur>> :: BST, classe std :: allocateur>> (void)" (?? 0? $ BST @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocateur @ D @ 2 @@ std @@@@ QAE @ XZ) déjà défini dans AVL.obj

Je suis complètement à la perte de ce que faire. J'ai parcouru quelques forums, regardé la page MSDN, et rien n'a été capable de la réparer.

Une chose que j'ai remarquée sur un site que j'ai oublié était d'avoir # ifndef/# défini pour mon AVL. J'ai créé un nouveau projet et copié et collé tout mon code avec cet ajout, et je reçois toujours la même erreur. J'ai examiné mon code pour vérifier que je ne fais pas plusieurs inclusions de bibliothèques. Cependant, je ne sais pas quoi faire d'ici.

Merci pour toute aide que vous pouvez fournir, et désolé à l'avance si j'ai omis quelque chose d'important.

Editer: Je ne suis pas sûr à 100% de ce que vous entendez par inline, en essayant de le faire maintenant. J'ai un cpp séparé où je définis les fonctions réelles. Est-ce que la chose en ligne dans la réponse de Greg s'appliquerait toujours? MSN, j'ai peur de ne pas avoir compris votre réponse. En ce qui concerne plusieurs copies du constructeur par défaut, je n'ai

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

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

Je ne sais pas si c'est ce que vous parliez, ou si cela pourrait être la question. Mon fichier d'en-tête n'a que BST(); rien pour le template int ou string. J'ai ces définitions dans mon cpp parce que mon instructeur a dit qu'elles étaient nécessaires pour la classe modèle.

Merci beaucoup

Répondre

0

Declare BST :: BST (vide) en ligne et assurez-vous que vous ne violaient pas la règle d'une définition et d'avoir différentes implémentations de BST :: BST (vide) en fonction d'une autre préprocesseur amusement.

1

Il semble que vous ayez défini une méthode dans un fichier d'en-tête de manière non linéaire. Par exemple, ayant la suivante dans un fichier d'en-tête peut provoquer un tel problème:

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

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

Avec qui dans le fichier d'en-tête, puis l'inclure dans deux modules différents fourniront des deux définitions différentes de la même fonction Foo<T>::bar(), la erreur résultant que vous avez. Une solution consiste à déclarer la ligne de fonction:

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

vous ne définissez pas un constructeur pour chaque type instancié de votre modèle. Vous avez seulement besoin d'un constructeur, pour BST. Vous pouvez créer une instance de la classe de noeud à l'aide du paramètre de modèle:

root = new Node<T>(); 
Questions connexes