2013-04-08 5 views
7

मैं इस ज फ़ाइल है:चर आंतरिक संबंध है, लेकिन निर्धारित नहीं है

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 

जब मैं संकलन बजना का कहना है:

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

क्या समस्या यहाँ है?

+1

आपके पास एक स्थिर वर्ग चर है। क्या यह लिंकेज रिज़ॉल्यूशन के लिए कहीं भी सही ढंग से परिभाषित किया गया है (लोड किया गया सवाल, क्योंकि जो संदेश आप दिखा रहे हैं वह उत्तर को स्पष्ट करता है)। स्टेटिक क्लास सदस्यों को कक्षा में घोषित करने की आवश्यकता है, फिर कक्षा के बाहर परिभाषित किया जाना चाहिए। आपको इस हेडर के लिए संबंधित .cpp फ़ाइल में 'स्थिर DenseMap <फ़ंक्शन *, DenseMap <निर्देश *, Invariant *>> Invariant :: Invariants;' की आवश्यकता है। – WhozCraig

+0

यदि मैं ऐसा करता हूं, तो लिंकिंग चरण में प्रकट होता है: llvm [0]: डीबग + आवेषण लोड करने योग्य मॉड्यूल Acsl.so '/ home/giacomo/llvmtmp/llvm-csfv/डीबग + आवेषण/lib/Acsl खोलने में त्रुटि। तो ': /home/giacomo/llvmtmp/llvm-csfv/Debug+Asserts/lib/Acsl.so: अपरिभाषित प्रतीक: _ZN12_GLOBAL__N_19Invariant10InvariantsE -लोड अनुरोध अनदेखा किया गया। –

+0

मुझे नहीं लगता कि आपने "स्थिर" शब्द रखा था जब आपने इसे अपनी हेडर फ़ाइल से कॉपी किया था, है ना? इसे .cpp फ़ाइल में घोषित नहीं किया जाना चाहिए 'स्थिर' होना चाहिए। इसे शामिल करने के लिए मेरा बुरा। उसके लिए माफ़ करना। – WhozCraig

उत्तर

6

बस इसे परिभाषित करें।

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

यह जो अद्वितीय है हर अनुवाद इकाई है कि इस शीर्ष लेख (जो ठीक है क्योंकि यह गुमनाम नाम स्थान में है भी शामिल है, में स्थिर सदस्य बना देगा: वर्ग परिभाषा के बाद, लेकिन गुमनाम नाम स्थान के अंत से पहले इस लाइन को जोड़ने प्रत्येक अनुवाद इकाई के लिए)। शायद यह नहीं है कि आप क्या चाहते हैं, लेकिन यह अज्ञात नेमस्पेस में Invariant को परिभाषित करने से है। यदि आप इसके बजाय नामित नेमस्पेस का उपयोग करते हैं, तो आप Invariants की परिभाषा को स्रोत फ़ाइल में डाल सकते हैं और केवल एक ही ऑब्जेक्ट को सभी कोड द्वारा साझा किया जा सकता है।

संबंधित मुद्दे