2017-02-05 13 views
0

Ich bin relativ neu in C++ und derzeit ein Problem, das unten beschrieben. Bitte geben Sie Ihre Eingaben an, um das Verständnis für den Namespace zu verbessern und dieses Problem zu lösen.C++ - Namespace-Fehler: kein Mitglied von Namespace

Ich habe eine Variable in einem Namespace als extern in einer Header-Datei deklariert, sagen a.h Ich schließe diese Datei in eine .cpp-Datei sagen a.cpp und definieren diese Variable im selben Namespace. Das funktioniert gut. Jetzt bin ich diese Header-Datei in einer anderen CPP-Datei enthalten, sagen b.cpp und diese Variable in einem anderen Namespace verwenden. Dies wirft den Fehler auf, dass die Variable 'a' in diesem Bereich nicht deklariert ist. Ich schließe den Namespace mit 'using namespace' in der Datei b.cpp ein. Trotzdem bekomme ich den gleichen Fehler. Wenn Sie den Ausdruck namespace :: variable in b.cpp verwenden, wird die Fehlermeldung ausgegeben, dass die Variable 'a' kein Mitglied dieses Namespaces ist.

Im Folgenden sind die Code-Schnipsel zum Verständnis meines Problems.

// a.h 
namespace example1 
{ 
extern int a; 
} 
// a.cpp 
#include"a.h" 
namespace example1 
{ 
a = 10; 
} 
// b.cpp 
#include"a.h" 
namespace example2 
{ 
a = 5; // error : 'a' not declared in this scope. 
} 
// b.cpp 
#include"a.h" 
using namespace example1; 
namespace example2 
{ 
a = 5; // error : 'a' not declared in this scope. 
} 
// b.cpp 
#include"a.h" 
namespace example2 
{ 
example1::a = 5; // error : 'a' not a member of example1. 
} 

Vielen Dank im Voraus.

Grüße, Karthik

+0

'a = 10;' soll auch einen Fehler erzeugen. – Oliv

+0

Ich muss auf die Variable 'a' im Namespace von example2 zugreifen. Wie mache ich es? – user1948512

+0

Sie können jedoch keine Variablen im Namensraumbereich zuweisen. Im Namensraumbereich können Sie nur eine Variable deklarieren oder definieren. 'a = 10' ist keine Definition. Sie können Variablen nur in Funktionen zuweisen. Wenn Sie a definieren möchten, schreiben Sie "int a = 10;" – Oliv

Antwort

0

Innerhalb ah deklarieren Sie eine Variable als extern, so die Definition in einer CPP-Datei (Übersetzungseinheit korrekt sein) erscheinen wird:

// a.h 
namespace example1 
{ 
    extern int a; 
} 

hier So ist die Datei, in der Sie die Variable definieren:

// a.cpp 
#include"a.h" 
namespace example1 
{ 
    int a = 10; 
} 

Jetzt verwenden Sie die Variable a in a.cpp definiert

// b.cpp 
#include"a.h" 
namespace example2 
{ 
    void f(){ 
    a = 5; // error : 'a' not declared in this scope. 
    } 
} 

Und tatsächlich ist ein in Namespace Beispiel1, ein nicht qualifizierter Name und Compiler schlägt fehl. (Compiler sucht eine in Namespace :: example2 und seine Mutter der globalen Namensraum)

Zweites Beispiel:

// b.cpp 
#include"a.h" 
using namespace example1; 
namespace example2 
{ 
    void f(){ 
    a = 5; 
    } 
} 

Dies sollte da kompilieren jetzt a im globalen Namensraum Umfang sichtbar ist. Aber wenn Sie immer noch einen Fehler sehen, sollte es in der Verknüpfungsphase sein. Vor dem Erstellen der ausführbaren Datei wird der Linker nach einer Definition von a suchen, also müssen Sie ihm auch das Ergebnis der Kompilierung von a.cpp geben. Wenn Sie beispielsweise GCC verwenden, kompilieren Sie mit dieser Befehlszeile c++ b.cpp a.cpp.

Dies gilt auch für dieses Beispiel:

// b.cpp 
#include"a.h" 
namespace example2 
{ 
    void f(){ 
     example1::a = 5; 
    } 
} 

Hier können Sie qualifizierten Namen nachschlagen durchführen, so dass es kompilieren sollte. Wenn ein Fehler auftritt, sollte dies zur Verbindungszeit sein, wie im vorherigen Beispiel beschrieben.

+0

Danke. Dies ist hilfreich, um den Namensraum klar zu verstehen. – user1948512

Verwandte Themen