2012-12-22 10 views
6

जब एक साधारण वर्ग (g++ myclass.cpp), मैं निम्नलिखित त्रुटि मिलती है संकलित करने के लिए कोशिश कर रहा है:आईएसओ सी ++ कोई प्रकार के साथ 'टपल' की घोषणा की मनाही

ISO C++ forbids declaration of ‘tuple’ with no type 

मैं इस समस्या के लिए खोज की है, और ज्यादातर मामलों लोगों में लग रहा था हेडर में std:: या <tuple> को भूलना। लेकिन मेरे पास दोनों हैं। यहाँ मेरी कोड है:

myclass.h

#ifndef MYCLASS 
#define MYCLASS 

#include <iostream> 
#include <tuple> 

class MyClass { 
    std::tuple<bool, int, int> my_method(); 
}; 

#endif 

myclass.cpp

#include "myclass.h" 

using namespace std; 

tuple<bool, int, int> MyClass::my_method() { 
    return make_tuple(true, 1, 1); 
} 

अगर मैं बजाय pair का उपयोग कर, दूसरी int बाहर छोड़ने और <set> सहित एक ही है , यह काम करता हैं।

मुझे क्या याद आ रही है?

संपादित करें:

यहाँ पूर्ण उत्पादन होता है:

$ g++ myclass.cpp -o prog 
In file included from myclass.cpp:1: 
myclass.h:7: error: ISO C++ forbids declaration of ‘tuple’ with no type 
myclass.h:7: error: invalid use of ‘::’ 
myclass.h:7: error: expected ‘;’ before ‘<’ token 
myclass.cpp:5: error: expected constructor, destructor, or type conversion before ‘<’ token 

$ g++ --version 
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) 
(LLVM build 2336.11.00) 
+5

क्या आपने कोड को संकलित करते समय '-std = C++ 11' निर्दिष्ट किया था? –

+5

'नेमस्पेस std का उपयोग कर;' - क्या निंदा है! –

+0

इस त्रुटि को पुन: उत्पन्न नहीं कर सकता है। क्या आप वाकई इस कोड का उपयोग करते हैं? आपको सटीक लाइन g ++ की सूचना दी जानी चाहिए। – Zeta

उत्तर

12

जीसीसी 4.2.1 प्रत्येक मैक के साथ भेज दिया गया पुराना है। यह सी ++ 11 को पहचान नहीं पाएगा।

आपको g ++ के बजाय C++ का उपयोग करके अपना कोड संकलित करने की आवश्यकता है जो मैक पर आधिकारिक रूप से अद्यतन कंपाइलर है।

c++ -std=c++11 -stdlib=libc++ myclass.cpp -o prog 

आप libC++ जो बजना lib जो डिफ़ॉल्ट libstdC++ जीसीसी द्वारा प्रयोग किया जाता के बजाय के बारे में C++ 11 सुविधाओं जानता है के खिलाफ लिंक करना आवश्यक है।

+1

क्या कोई कारण है, मेरे 2012 मैक (ओएस एक्स 10.8.2, नवीनतम एक्सकोड) पर क्यों मेरे पास ऐसा पुराना जीसीसी होगा? (मैंने इसे स्वयं स्थापित नहीं किया, शायद एक्सकोड किया था)। अगर मैं अपडेट करने का प्रयास करता हूं तो मुझे अपने पर्यावरण को तोड़ने से डर लगता है। – Jawap

+0

नहीं यह सामान्य है। ऐप्पल चकित हो गया है और जीसीसी गिरा दिया है लेकिन वे रेट्रो संगतता को तोड़ने के लिए नहीं रखते हैं। – Kikohs

+0

यदि आप जीसीसी को अपडेट करने का प्रयास करते हैं तो आप अपने पर्यावरण को तोड़ देंगे। क्लैंग का प्रयोग करें, यह वैसे भी तेज है ... – Kikohs

1

जोड़ते हैं -std=c++11 (या g++-std=c++0x के पुराने संस्करणों के लिए,) विकल्प और सदस्य संकलन कोड अभिव्यक्ति में अभिव्यक्ति के बाद एक simicolon जोड़ें। यदि यह काम नहीं करता है तो आपके पास एक संस्करण हो सकता है जो केवल tuple को नेमस्पेस std::tr1 में परिभाषित करता है (ऐसा लगता है कि कार्यान्वयन <tuple> शीर्षलेख प्रदान करता है, हालांकि, <tuple> नहीं मिला है)।

5

अद्यतन! हम इन दिनों जीसीसी 4.7 पर हैं।

जीसीसी 4.2.1 18th July, 2007 पर सभी तरह से वापस है। केवल एक दूरस्थ मौका है कि यह किसी भी सुविधाओं का समर्थन करता है जो सी ++ 11 बन गया है।

यह कहा गया है कि यह std::tr1 (यानी std::tr1::tuple<T1, T2, ...>) में कुछ प्रदान कर सकता है, जहां कुछ सी ++ 11 विशेषताएं मानकीकरण से पहले समय में रहती थीं, हालांकि मेरे सिर के ऊपर से इन्हें केवल जीसीसी में पेश किया गया था 4.4।

+1

क्या कोई कारण है, क्यों मेरे 2012 मैक (ओएस एक्स 10.8.2, नवीनतम एक्सकोड) पर मेरे पास ऐसा पुराना जीसीसी होगा? (मैंने इसे स्वयं स्थापित नहीं किया, शायद एक्सकोड किया था)। अगर मैं अपडेट करने का प्रयास करता हूं तो मुझे अपने पर्यावरण को तोड़ने से डर लगता है। – Jawap

+0

@ Waptrick: मुझे मारता है। पैकेजिंग टीम से पूछें। –

+1

मैक पर जीसीसी अपडेट करना अच्छा नहीं है। यह संगतता तोड़ देगा। आपके पास एक gcc हो सकता है लेकिन/usr/bin/gcc – Kikohs

3

जीसीसी 4.2, tuple नामस्थान std::tr1 में था।आप <tr1/tuple> शामिल करने और अपने विधि, के रूप में दूसरों को पहले से ही सुझाव दिया एक और हाल ही में जीसीसी के लिए अद्यतन करने के लिए और अधिक उपयुक्त हो सकता है इस

#ifndef MYCLASS 
#define MYCLASS 

#include <tr1/tuple> 

class MyClass { 
    std::tr1::tuple<bool, int, int> my_method(); 
}; 

#endif 

हालांकि तरह कम या ज्यादा निर्दिष्ट करते हैं, करना होगा।

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