2015-09-04 22 views
5

मैं एक प्रोजेक्ट संकलित करने की कोशिश कर रहा हूं जिसमें निम्न शीर्षलेख है: locale.h;प्रोजेक्ट संकलित नहीं कर सकता: locale.h फ़ाइल में त्रुटि

locale.h:

class LOG4CXX_EXPORT Locale 
{ 
public: 
     ... 

protected: 
    Locale(const Locale&); 
    Locale& operator=(const Locale&); 
    const LogString language; <-- error 
    const LogString country; <-- error 
    const LogString variant; <-- error 
}; // class Locale 

किसी को भी मुझे कुछ सुझाव दे सकते हैं?

मुझे यह त्रुटि मिल रही है। मुझे यकीन नहीं है कि समस्या क्या है।

/LOGGER/include/log4cxx/helpers/locale.h:42:41: error: field ‘language’ has incomplete type 
        const LogString language; 
            ^
/LOGGER/include/log4cxx/helpers/locale.h:43:41: error: field ‘country’ has incomplete type 
        const LogString country; 
            ^
/LOGGER/include/log4cxx/helpers/locale.h:44:41: error: field ‘variant’ has incomplete type 
+0

मुझे संदेह है कि 'locale.h' नामक अपना हेडर सिस्टम हेडर 'locale.h' के साथ विवादित है। कंपाइलर में 'क्लोकेल' से ** ** ** locale.h' शामिल है। संघर्ष को खत्म करने के लिए अपने 'locale.h' का नाम बदलें। – AnT

+0

एएनटी, यह हो सकता है ... मैं locale.h सिस्टम हेडर की कॉलिंग को कैसे बहिष्कृत कर सकता हूं? – cristian

+0

आप सिस्टम हेडर को बाहर नहीं कर सकते हैं। जैसे स्टैक शो शामिल हैं, इसे 'स्ट्रिंग' हेडर द्वारा आवश्यक है। मैं तुरंत समझ में नहीं आता क्यों अपने हैडर यह हालांकि ओवरराइड करता है ... – AnT

उत्तर

0

आप std :: basic_string उपयोग कर रहे हैं, लेकिन कोई उचित हेडर फाइल के लिए शामिल है:

#include <string> 
+0

गिल्ड, फ़ाइल है: logstring.h में शामिल हैं: । मैंने इस सवाल में इसे जोड़ा है। – cristian

1

पर विचार करें निम्नलिखित कोड:

class MyClass; 

int method1(const MyClass& param); 
MyClass& method2(); 
const MyClass instance; // <- error here 

MyClass की घोषणा है एक forward declaration। सभी संकलक जानते हैं कि वर्ग मौजूद है (यह इसके सदस्यों, आकार ... को नहीं जानता है), यही कारण है कि इसे incomplete type कहा जाता है। आप उस वर्ग के संदर्भ या पॉइंटर्स का उपयोग कर सकते हैं, लेकिन यह है। अधिक जानकारी यहां देखें https://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration

तो ऐसा लगता है कि आपके कोड में, आपके पास केवल LogString प्रकार की अगली घोषणा है, और पूर्ण घोषणा नहीं है। अपनी फ़ाइलों को शामिल करें और ऑर्डर शामिल करें ताकि आपको इस कक्षा की पूरी घोषणा मिल सके।

+0

Dazzibao, स्पष्टीकरण के लिए धन्यवाद। मैं पूरी घोषणा खोजने की कोशिश करूंगा। एक और बात यह है कि यह कोड विजुअलस्टूडियो (विंडोज़) पर संकलित है ... यह त्रुटियां मैं ग्रहण-लिनक्स पर प्राप्त कर रहा हूं ... वास्तव में एक फ़ाइल शामिल हो सकती है जो मुझे याद आई। – cristian

+0

Dazzibao, क्या मैं कुछ विशिष्ट खोज सकता हूं? पूर्ण घोषणा को खोजने के लिए ... सभी मैंने पाया संदर्भ के बहुत सारे है .... – cristian

+0

LogString एसटीडी के लिए एक typedef :: basic_string, जो शामिल फ़ाइल में घोषित है - तो इस समस्या नहीं हो सकता है - अगर यह के लिए था लॉग परिभाषित नहीं किया जा रहा चार, संकलन त्रुटि typedef (लॉग चार सक्रिय करने के ऊपर इन मैक्रो की इसलिए किसी भी परिभाषित किया जाना चाहिए) पर प्रदर्शित किया गया होता। – Aconcagua

0

क्या चींटी एक टिप्पणी में लिखा है समस्या का समाधान है:

<clocale> प्रणाली एक यह करना चाहिए की अपने <locale.h> सहित बजाय; आपका लोकेल < स्ट्रिंग > शामिल करने का प्रयास कर रहा है, जिसमें फिर से < क्लोकेल > शामिल है।

तो अंत में, आप एक परिपत्र में शामिल हैं के रूप में मैं अपने अन्य प्रश्न https://stackoverflow.com/questions/32379927/header-file-does-not-compile-locale-h में वर्णित है, बस श्रृंखला लंबे समय तक किया जा रहा है ...

आप इस शामिल किए जाने के चक्र को तोड़ने की जरूरत है। आप निर्देशिका को हटाकर उस निर्देशिका को हटाकर कर सकते हैं जो फ़ाइल आपके पास जीसीसी में पास की गई निर्देशिकाओं से होती है (मुझे लगता है कि यह है- I "/ LOGGER/include/log4cxx/helpers")। इसके बजाए, आप मूल निर्देशिका (-I "/ LOGGER/include /") के लिए पथ दे सकते हैं। #include <locale.h> के बजाय आपको #include <log4cxx/helpers/locale.h> का उपयोग करना होगा।

दरअसल, मैं "/ LOGGER/include" को केवल एक ही निर्देशिका के रूप में रखने की अनुशंसा करता हूं जो आप जीसीसी देते हैं और अन्य सभी फाइलों को आपको संबंधित उपपथ के माध्यम से शामिल करने की आवश्यकता होती है - बशर्ते बाकी लॉग 4cxx फाइलें (जो मुझे लगता है) ।

इसके अलावा, समस्या को हल करने का एकमात्र अन्य तरीका वास्तव में आपकी 'locale.h' फ़ाइल को किसी अन्य चीज़ का नाम बदल रहा है (इसमें पथ विभाजन शामिल है, जैसे- I "/ LOGGER/include/log4cxx" और # शामिल < सहायक/locale.h >; हालांकि, मैंने चुना है, सबसे प्राकृतिक एक आईएमओ है)।

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