2009-10-27 10 views
5

मेरी समस्या यह है कि जब मैं एक डाउनलोड लाइब्रेरी बनाना चाहता हूं तो मुझे GCC से कुछ अजीब संकलन त्रुटियां मिलती हैं और जिस कोड को संकलक सही करने की मांग करता है वह सही लगता है।जीसीसी संकलन त्रुटि: 'strlen' की घोषणा उपलब्ध होनी चाहिए

Catalogue.h:96: error: there are no arguments to ‘strlen’ that depend on a template parameter, so a declaration of ‘strlen’ must be available

यहाँ लाइन 96 के आसपास कोड है::

त्रुटियों इस तरह सभी कर रहे हैं

GaCatalogueEntry(const char* name, T* data) 
{ 
    if(name) 
    { 
     _nameLength = (int)strlen(name); // LINE 96 

     // copy name 
     _name = new char[ _nameLength + 1 ]; 
     strcpy(_name, name);  // LINE 100: similar error 

     _data = data; 

     return; 
    } 

    _name = NULL; 
    _nameLength = 0; 
    _data = NULL; 
} 

क्या मैं इन त्रुटियों को ठीक करने के लिए संकलन कर सकते हैं?

+0

ऐसा लगता है कि आपके पास नामों के साथ ग्लोबल्स का एक सेट है जो '_ [a-z]। *' से मेल खाता है, उन नामों को कार्यान्वयन के लिए आरक्षित किया गया है। ('_ [a-z]। *' गैर-वैश्विक नामों जैसे स्थानीय चर और वर्ग के सदस्यों के लिए ठीक है) – MSalters

+0

मुझे नहीं लगता कि वे ग्लोबल्स हैं - बल्कि सदस्य चर हैं। मुझे लगता है कि GaCatalogueEntry एक टेम्पलेट श्रेणी में एक सदस्य समारोह है। लेकिन आप सही हैं, नामकरण सम्मेलन रखना खतरनाक है जिसमें अंडरस्कोर उपसर्ग शामिल हैं। सदस्य चर के लिए, m_ उपसर्ग, या _ प्रत्यय का उपयोग करना बेहतर है। –

उत्तर

3

कोड खराब है। आप शायद #include <string.h> खो रहे हैं।

यदि आप कोड को बदलना नहीं चाहते हैं, तो संकलक विकल्पों में -fpermissive जोड़ें। (GCC documentation देखें।)

10

आपको शायद उस शीर्षलेख को शामिल करने की आवश्यकता है जिसमें स्ट्रैपी और स्ट्रेल लाइब्रेरी फ़ंक्शन शामिल हैं।

#include <string.h> 

या (सी ++ के लिए अधिमानतः)

#include <cstring> 
+1

बहुत बेहतर! (और आपको केवल strlen के बजाय std :: strlen() का उपयोग करना होगा)। – Ben

4

सी ++ strlen() फ़ंक्शन स्ट्रिंग पुस्तकालय का हिस्सा है, और यह लगभग लगता है कि हेडर फाइल शामिल नहीं किया गया है।

क्या यह कहीं भी शामिल है?

include <string.h> 

यदि नहीं, तो इसे जोड़ने का प्रयास करें और देखें कि यह समस्या को हल करता है या नहीं।

+0

हां, समस्या अनुपलब्ध हेडर फ़ाइल थी। लेकिन मुझे लगता है कि त्रुटि संदेश जावा जैसी भाषाओं के रूप में अग्रणी नहीं हैं। – Navid

+1

इस मामले में, त्रुटि का कारण इस तथ्य से कुछ हद तक खराब हो गया था कि कोड टेम्पलेट का हिस्सा था। कंपाइलर को टेम्पलेट में एक अज्ञात प्रतीक मिला, जो टेम्पलेट पैरामीटर टी पर निर्भर था, जब टेम्पलेट वास्तव में तत्काल चालू हो गया था, तब तक एक त्रुटि उत्पन्न नहीं हुई थी, (उदाहरण के लिए यदि प्रतीक टी :: dosomething ()) –

1

a declaration of ‘strlen’ must be available

string.h या <cstring> (C++) strlen() की घोषणा के लिए शामिल करें।

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