2016-07-28 12 views
-2

Wenn ich eine Klasse mit privaten statischen Mitgliedern in einem Namespace:Definieren ein statische Klasse Element innerhalb eines anderen Namespace

namespace A { 
class T { 
    public: 
     //functions 
    private: 
     static bool a; 
     static unsigned int b; 

Und ich tue Unit-Tests dieser Klasse in einer anderen Datei wie:

namespace { 

bool A::T::a = false; 
unsigned int A::T::b = 1; 

/* tests declaring an instance of A...*/ 

ich erhalte den Fehler von Clang:

error: cannot define or redeclare 'a' here because namespace '' does not enclose namespace 'T' error: cannot define or redeclare 'b' here because namespace '' does not enclose namespace 'T'

Ich habe andere Antworten auf statische private Mitglieder und die Notwendigkeit, sie zu erklären, wo die Deklaration der Klasse ist, was ich glaube, dass ich hier mache, aber der Fehler immer noch entgeht mir.

+0

'Namespace {' ist anonym. Definition, wie die Deklaration in 'Namespace A' vorgeschlagen wurde, kann dort nicht durchgeführt werden, Punkt. –

Antwort

1

Ich habe bei anderen Antworten in Bezug auf statische privaten Mitglieder und die Notwendigkeit sieht, sich zu erklären, wo die Deklaration der Klasse ist, das ist, was ich glaube, dass ich hier tue,

Nein, du bist nicht das tun. Wenn sich die Deklaration in "foo.h" befindet, sollte die Definition in "foo.cpp" sein, nicht in einer Datei, die für Komponententests verwendet wird.

aber der Fehler entkommt mir immer noch.

namespace { 

definiert eine anonyme namespace, die aus dem globalen Bereich unterscheidet. Namen, die im anonymen namespace deklariert sind, sind nur in der Übersetzungseinheit sichtbar. Alles, was im anonymen namespace definiert ist, muss in diesem namespace auch erklärt werden.

können Sie verwenden:

bool A::T::a = false; 
unsigned int A::T::b = 1; 

Noch besser ist es, zu verwenden:

namespace A { 

    bool T::a = false; 
    unsigned int T::b = 1; 

und diese Zeilen Code setzen in der CPP-Datei zu der H-Datei entspricht, nicht in dem Unit-Test Datei.