2016-11-29 7 views
0

Ich habe 2 Header-Dateien erstellt. ListA.h und ListN.hRedefinition-Fehler: Verschiedene .h-Dateien mit dem gleichen Klassennamen

Sie beide machen ihre eigene Verwendung ihrer eigenen einzigartigen Klasse Liste. Wenn ich mein Programm kompiliere (obwohl sie keine Möglichkeit haben zu wissen, dass das andere existiert, sagt es den folgenden Fehler)

Ich bin ziemlich sicher, es sollte nicht eine Neudefinition sein, aber es ist offensichtlich. Jede Hilfe wird geschätzt.


ListA.h

#ifndef __LISTA_H_ 
#define __LISTA_H_ 
#include <iostream> 

using namespace std; 
class List{ 
     public: 
       List(int = 0); 
       List(const List&); 
       ~List(); 
}; 
#endif 

ListN.h

#ifndef __LISTN_H_ 
#define __LISTN_H_ 
#include <iostream> 

using namespace std; 

class List{ 
     public: 
       List(int = 10); 
       List(const List&); 
       ~List(); 
};  
#endif 

ListA.cpp

#include "ListA.h" 
using namespace std; 

List::List(int mySize) 
{ 
    //... 
} 

ListN.cpp

#include "ListN.h" 
#include <iostream> 
using namespace std; 
List::List(int size) 
{ 
    //... 
} 

Haupt

#include <iostream> 
#include "ListN.h" 
using namespace std; 

int main() 
{ 
    List myList; 
    return 0; 
} 
+1

Sie sind beide im selben Projekt, das _might_ etwas damit zu tun haben könnte. –

+0

** [basic.defodr] ** "Wenn eine solche Entität mit dem Namen D in mehr als einer Übersetzungseinheit definiert ist, dann muss jede Definition von D aus der gleichen Folge von Token bestehen ..." Sie haben diese Regel verletzt, indem Sie eine Entität namens "List", die in verschiedenen Übersetzungseinheiten unterschiedlich definiert ist. –

Antwort

0

Wenn Linker die Definition/Symbol für List zu verknüpfen finden versuchen, es in zwei verschiedenen OBJ-Datei gefunden und daher Linker Geber Fehler. In Visual Studio Fehlernummer: LNK2005

diese Fehler zu lösen, entweder:

  1. Um dies zu beheben, fügen Sie /FORCE:MULTIPLE an den Linker-Befehlszeilenoptionen
  2. die Klassen in zwei verschiedenen Namespaces hinzufügen, die diesen Fehler vermeiden werden .

ListN.h

#ifndef __LIST_H_ 
#define __LIST_H_ 
#include <iostream> 

using namespace std; 

namespace ListN 
{ 
    class List{ 
    public: 
     List(int = 10); 
     List(const List&); 
    }; 
} 

#endif 

ListN.cpp

#include "ListN.h" 
#include <iostream> 

using namespace std; 

namespace ListN 
{ 
    List::List(int size) 
    { 
     //... 
    } 
} 

Main.cpp

#include <iostream> 
#include "ListN.h" 
int main() 
{ 
    ListN::List myList; 
    return 0; 
} 
+0

Jetzt die Hauptdatei sagt, dass Liste nicht im Geltungsbereich –

+0

Namespace vor Benutzer wie für meinen Fall ListN :: List verwendet wurde. ODER fügen Sie mit dem Namespace ListN hinzu. – Swapnil

+0

@GunnerStone Überprüfen Sie die aktualisierte Antwort. – Swapnil

0

Beide cpp-Dateien werden vom Compiler kompiliert. Wenn also der Linker die Dateien miteinander verknüpft, wird er verwirrt, da es mehrere Klassen List gibt.

Um dies zu beheben, könnten Sie Namespaces verwenden, oder Sie kalt nicht mindestens eine der Klassen List.


Alternativ, wenn die Idee schließen ListN.h vs ListA.h zur Konfiguration in der Lage war, dann ist dies der falsche Weg, dies zu tun. Entweder sollten Sie einen #define Parameter für den Header haben, oder Sie sollten einen anderen Weg finden, zum Beispiel durch #ifdef. Zum Beispiel (ich nicht 100% sicher bin, würde dies kompilieren, aber Sie erhalten die Idee):

list.h

#ifndef __LIST_H_ 
#define __LIST_H_ 

#ifndef LIST_PARAM 
#define LIST_PARAM 0 
#endif 

#include <iostream> 

using namespace std; 

class List{ 
     public: 
       List(int = LIST_PARAM); 
       List(const List&); 
       ~List(); 
};  
#endif 

main.cpp

#include <iostream> 

#define LIST_PARAM 10 
#include "List.h" 

using namespace std; 

int main() 
{ 
    List myList; 
    return 0; 
} 

I persönlich mag diese Methode nicht; Es ist viel besser, den Wert einfach an den Konstruktor zu übergeben:

int main() 
{ 
    List myList{ 10 }; 
    return 0; 
} 
Verwandte Themen