2013-04-08 17 views
7

ich diese .h-Datei haben:Variable interne Bindung ist aber nicht definiert

namespace{ 

class Invariant{ 
public: 
    Invariant(z3::expr e,Instruction *i):Expr(e),I(i){ 
    DenseMap<Instruction*,Invariant*> FunMap = Invariants[F]; 
    } 

private: 
    //static map 
    static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants; 

}; 
}//end of anonymous namespace 

Wenn ich kompilieren Klirren sagt:

Invariant.h:46:65: warning: variable '<anonymous namespace>::Invariant::Invariants' has internal linkage but is not defined 
    static DenseMap<Function*, DenseMap<Instruction*,Invariant*> >Invariants; 
                   ^
Invariant.h:26:48: note: used here 
    DenseMap<Instruction*,Invariant*> FunMap = Invariants[F]; 

Was ist das Problem?

+1

Sie haben eine statische Klassenvariable. Ist es irgendwo für die Auflösung der Verbindung richtig definiert (geladene Frage, da die Nachricht, die Sie zeigen, die Antwort ziemlich offensichtlich macht). Statische Klassenmitglieder müssen in Klassen deklariert und dann außerhalb der Klasse definiert werden. Sie benötigen eine 'static DenseMap > Invariant :: Invariants;' in der zugehörigen .cpp-Datei für diesen Header. – WhozCraig

+0

Wenn ich das mache, erscheint in der Linking-Phase: llvm [0]: Verknüpfung Debug + Asserts ladbares Modul Acsl.so Fehler beim Öffnen von '/ home/giacomo/llvmtmp/llvm-csfv/Debug + Asserts/lib/Acsl. so ': /home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so: undefiniertes Symbol: _ZN12_GLOBAL__N_19Invariant10InvariantsE -load-Anforderung ignoriert. –

+0

Ich vermute nicht, dass Sie das Wort "statisch" behalten haben, als Sie das aus Ihrer Header-Datei kopiert haben, oder? Es sollte nicht "statisch" in der CPP-Datei deklariert sein. Mein schlechtes für die Aufnahme. Das tut mir leid. – WhozCraig

Antwort

6

Definieren Sie es einfach. Nach der Klassendefinition, aber vor dem Ende des anonymen Namespace diese Zeile hinzu:

DenseMap<Function*, DenseMap<Instruction*,Invariant*> > Invariant::Invariants; 

Dies wird das statische Element in jeder Übersetzungseinheit erstellen, die diesen Header enthält (das ist in Ordnung, weil es in dem anonymen Namespace ist, die einzigartig ist zu jeder Übersetzungseinheit). Das ist wahrscheinlich nicht das, was Sie wollen, aber das folgt aus der Definition Invariant in einem anonymen Namensraum. Wenn Sie stattdessen einen benannten Namespace verwenden, können Sie die Definition Invariants in eine Quelldatei einfügen und nur ein Objekt für den gesamten Code freigeben.

Verwandte Themen