2013-04-08 19 views
7

ho questo file h:variabile ha il collegamento interno, ma non è definito

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 

Quando compilo clang dice:

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]; 

Qual è il problema?

+1

Si dispone di una variabile di classe statica. È definito correttamente ovunque per la risoluzione del linkage (domanda caricata, dal momento che il messaggio che stai visualizzando rende la risposta piuttosto ovvia). I membri delle classi statiche devono essere dichiarati in classe, quindi definiti fuori classe. È necessario un 'DenseMap statico > ​​Invariant :: Invariants;' nel file .cpp associato per questa intestazione. – WhozCraig

+0

Se lo faccio, nella fase di collegamento appare: llvm [0]: Collegamento Debug + Avvisa modulo caricabile Acsl.so Errore durante l'apertura di '/ home/giacomo/llvmtmp/llvm-csfv/Debug + Asserts/lib/Acsl. così: /home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so: simbolo non definito: _ZN12_GLOBAL__N_19Invariant10InvariantsE -load richiesta ignorata. –

+0

Non credo che tu abbia mantenuto la parola "statica" quando l'hai copiato dal tuo file di intestazione, vero? Dovrebbe * non * essere 'static' dichiarato nel file .cpp. Il mio male per averlo incluso Mi dispiace per quello – WhozCraig

risposta

6

Basta definirlo. Dopo la definizione della classe, ma prima della fine del namespace anonimo Aggiungi questa linea:

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

questo creerà il membro statico in ogni unità di traduzione che include questa intestazione (va bene perché è nello spazio dei nomi anonima, che è unica ad ogni unità di traduzione). Probabilmente non è quello che vuoi, ma ciò deriva dalla definizione di Invariant in uno spazio dei nomi anonimo. Se si utilizza invece uno spazio dei nomi denominato, è possibile inserire la definizione di Invariants in un file di origine e disporre di un solo oggetto condiviso da tutto il codice.

Problemi correlati