2013-05-09 5 views
8

नीचे कोड में, लाइन विजुअल स्टूडियो 2008 में एक C2061 त्रुटि मेंक्या यह एक वीएस -2008 बग है? कार्यात्मक शैली चर initialisation

const char * const * eNames (names+cntNames); 

परिणाम:

सिंटेक्स त्रुटि: पहचानकर्ता 'पहचानकर्ता' - संकलक एक पहचानकर्ता पाया जहां इसकी उम्मीद नहीं थी। सुनिश्चित करें कि इसका उपयोग करने से पहले पहचानकर्ता घोषित किया गया है। एक प्रारंभकर्ता कोष्ठक द्वारा संलग्न किया जा सकता है। इस समस्या से बचने के लिए, घोषणाकर्ता को कोष्ठक में संलग्न करें या इसे एक टाइपपीफ बनाएं। यह त्रुटि तब भी हो सकती है जब संकलक वर्ग टेम्पलेट तर्क के रूप में अभिव्यक्ति का पता लगाता है; कंपाइलर को बताने के लिए टाइपनाम का उपयोग करें यह एक प्रकार है।

अगर मैं

const char * const * eNames = names+cntNames; 

करने के लिए बदल यह शिकायत नहीं है। क्या यह एक कंपाइलर बग है? यदि नहीं, शिकायत क्यों?

मेरे बारे में बॉक्स का कहना है: संस्करण 9.0.30729.1 सपा

जीसीसी के साथ मेरे सहयोगी यह त्रुटि दिखाई नहीं देता है।

#include <string> 
#include <algorithm> 
#include <functional> 
#include <iostream> 

namespace ns1 { 

    struct str_eq_to 
    { 
     str_eq_to(const std::string& s) : s_(s) {} 
     bool operator()(const char* x) const { return s_.compare(x)==0; } 
     const std::string& s_; 
    }; 

    static bool getNameIndex(const char * const * names, size_t cntNames, const std::string& nm, int &result) 
    { 
     const char * const * eNames (names+cntNames); //VS2008 error C2061: syntax error : identifier 'names' 
     const char * const * p = std::find_if(names, eNames, str_eq_to(nm)); 
     if(p==eNames) return false; 
     result = p-names; 
     return true; 
    } 

} //namespace ns1 


int main() { 

    const char * const names[] = {"Apple", "Orange","Plum"}; 
    std::string str = "Plum"; 
    int res; 

    ns1::getNameIndex(names, 3, str, res); 
    std::cout << str << " is at index " << res << std::endl; 
    return 0; 
} 
+7

वीएस 2008 पांच साल पुराना है, संकलक वर्षों में सकारात्मक जेरियाट्रिक है, और (जाहिर है) तब से सी ++ में विकास के साथ नहीं रखा है। मैं आपको वीएस 2012 एक्सप्रेस डाउनलोड करने की सलाह देता हूं (शून्य लागत, पंजीकरण की आवश्यकता है) और इसे वहां आज़माएं। यदि यह काम करता है, तो आप मान सकते हैं कि वीएस 2008 गलत था। – zwol

+2

यह संदिग्ध रूप से सबसे अधिक परेशान-पार्स से संबंधित समस्या की तरह दिखता है। माता-पिता के दूसरे सेट को आज़माएं: 'const char * const * eNames ((नाम + cntNames));' –

+0

@MarkB - VS2008 तब डबल ब्रैकेट पसंद नहीं करते हैं और प्रत्येक ब्रैकेट के लिए C2059 प्राप्त करते हैं। –

उत्तर

4

यह निश्चित रूप से एक कंपाइलर बग है। गवाह:

extern char** a; 
typedef char* cp; 
char** c(a);  // error 
cp* c1(a);  // no error 
char** c2(c1); // error 
cp* n(0);   // no error 
char** n2(0);  // error 
संबंधित मुद्दे