2013-02-20 38 views
6

में एक वेक्टर में ट्यूपल से प्राप्त वस्तुओं को रखने के लिए मैं 3 मानों के साथ एक संरचना बनाना चाहता हूं: एक स्ट्रिंग और दो इंट्स। स्ट्रिंग अनिवार्य है, लेकिन इनट्स के या तो (या दोनों) वैकल्पिक हैं और निर्दिष्ट नहीं होने पर -1 तक डिफ़ॉल्ट हो सकते हैं।सी ++

हालांकि, एक संरचना का उपयोग करने के बजाय, मैंने सोचा कि मैं एक std :: tuple का प्रयास करूंगा।

#include <string> 
#include <tuple> 

class Trio : public std::tuple<std::string, int, int> 
{ 
    public: 

    explicit Trio(std::string const & name, int val1 = -1, int val2 = -1) 
    : 
     tuple(name, val1, val2) 
    { 
    } 
}; 

तो मैं कुछ तिकड़ी वस्तुओं धक्का द्वारा तिकड़ी वर्ग परीक्षण करने के लिए जाना: आदेश, एक "तिकड़ी" वर्ग जो एसटीडी से विरासत :: नीचे के रूप में टपल दो ints की वैकल्पिक सत्ता शामिल करने के लिए मैं सेटअप में

#include <vector> 
int main(void) 
{ 
    std::vector<Trio> trios; 

    Trio trio("trio1", 1, 1); 
    trios.push_back(trio); 

    return 0; 
} 

यह मेरे दृश्य स्टूडियो 2010 में निम्न त्रुटि देता है:: एक std :: वेक्टर में

>c:\program files (x86)\microsoft visual studio 10.0\vc\include\tuple(127): 
    error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const 
    std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1 
    from 'const Trio' to 'const std::basic_string<_Elem,_Traits,_Ax> &' 
with 
[ 
    _Elem=char, 
    _Traits=std::char_traits<char>, 
    _Ax=std::allocator<char> 
] 
Reason: cannot convert from 'const Trio' to 'const 
std::basic_string<_Elem,_Traits,_Ax>' 
with 
[ 
    _Elem=char, 
    _Traits=std::char_traits<char>, 
    _Ax=std::allocator<char> 
] 
No user-defined-conversion operator available that can perform 
this conversion, or the operator cannot be called 

किसी को समझ में है कि मैं क्या गलत तरीके से यहाँ कर रहा हूँ? क्या कुछ स्पष्ट है कि मैं बस नहीं देख रहा हूं? क्या मैं शायद, std :: tuple के उपयोग का गंभीर दुरुपयोग कर रहा हूं?

धन्यवाद,

हारून

+0

ideone पर ठीक संकलित: http://ideone.com/9q0nxW – Bill

+0

यह मेरे लिए के साथ जी ++ http://ideone.com/ZAIDUp – juanchopanza

उत्तर

8

में संकलित होगा यह वीसी 10 के है।

वीसी 10 शिकायत करता है क्योंकि आपकी कक्षा प्रतीत होता है कि एक प्रतिलिपि बनाने वाला है। इसलिए, Trio के मानों की प्रतिलिपि बनाने के लिए, यह उन्हें string में परिवर्तित करने का प्रयास करता है, जो आपके द्वारा प्रदान किए जाने वाले कन्स्ट्रक्टर (अन्य तर्कों को डिफ़ॉल्ट मान दिए जा सकते हैं)।

पैरामीटर 1 'स्थिरांक तिकड़ी' से परिवर्तित नहीं कर सकते 'स्थिरांक std :: basic_string < _Elem, _Traits, _Ax> &'

आप सत्यापित कर सकते हैं: यह त्रुटि आप प्राप्त शिकायत किस बारे में है

Trio(Trio const& t) { *this = t; } 

अब VC10 संतुष्ट है, क्योंकि यह एक प्रति निर्माता देखता है, और कोड ठीक संकलित: यह वास्तव में क्या स्पष्ट रूप से एक प्रतिलिपि निर्माता जोड़कर चल रहा है और घड़ी त्रुटि गायब है।

फिर भी, जब उपयोगकर्ता द्वारा कोई प्रतिलिपि स्पष्ट रूप से प्रदान नहीं की जाती है, तो आपके कंपाइलर को एक अंतर्निहित उत्पन्न करना चाहिए। प्रति पैरा सी ++ 11 स्टैंडर्ड की 12.8/7:

वर्ग परिभाषा स्पष्ट रूप से एक प्रति निर्माता की घोषणा नहीं करता है, एक परोक्ष घोषित किया जाता है। यदि कक्षा परिभाषा एक चालक कन्स्ट्रक्टर घोषित करती है या असाइनमेंट ऑपरेटर ले जाती है, तो निहित रूप से घोषित प्रतिलिपि को हटाए जाने के रूप में परिभाषित किया जाता है; अन्यथा, इसे डिफ़ॉल्ट (8.4) के रूप में परिभाषित किया जाता है। [...]

कक्षा Trio किसी भी प्रतिलिपि निर्माता को स्पष्ट रूप से घोषित नहीं करता है। अनुच्छेद 12 के अनुसार।सी ++ 11 स्टैंडर्ड की 8/2, वास्तव में:

दसवीं कक्षा के लिए एक गैर टेम्पलेट निर्माता अगर अपनी पहली पैरामीटर प्रकार एक्स &, स्थिरांक एक्स &, अस्थिर एक्स & की है एक प्रति निर्माता है या स्थिरांक अस्थिर एक्स &, और या तो कोई अन्य मापदंडों वरना सभी अन्य पैरामीटर डिफ़ॉल्ट तर्क (8.3.6)

इस प्रकार है, निर्माता आप स्पष्ट रूप से प्रदान नहीं एक प्रति निर्माता और चाहिए है एक कॉपी कन्स्ट्रक्टर की अंतर्निहित पीढ़ी को रोकता नहीं है।

वीसी 10 संभवतः एक प्रतिलिपि निर्माता के रूप में प्रदान किए गए निर्माता को गलत व्याख्या करता है और इसलिए, एक अंतर्निहित उत्पन्न नहीं करता है। क्या ऊपर लिखा की वजह से, तथापि, यह व्यवहार एक गलत (*)

एक तरफ ध्यान दें के रूप में, अपने कोड बजना 3.2, जीसीसी 4.7.2, और आईसीसी 13.0 पर ठीक संकलित है और एक बग के रूप में उत्तीर्ण।। 1।

अद्यतन:

मैं सरल डेटा संरचनाओं std::tuple<> को शामिल नहीं के साथ समस्या यह पुन: पेश करने की कोशिश की, और मैं असफल रहा। इसलिए, बग केवल इस तथ्य के कारण नहीं है कि आपके कन्स्ट्रक्टर को वीसी 10 द्वारा एक स्पष्ट प्रतिलिपि निर्माता के रूप में गलत व्याख्या किया गया है। हालांकि, यह इस तथ्य को नहीं बदलेगा कि वीसी 10 का व्यवहार गलत है।

+1

+1। – pstrjds

+0

यह काम किया। मैंने ट्रायो को एक स्पष्ट प्रतिलिपि निर्माता जोड़ा, और यह अभी ठीक है। धन्यवाद!!! – Aaron

+0

@Aaron: खुशी हुई यह मदद की :-) –

1

ऐसा लगता है कि इस VS2010 में सिर्फ एक मुद्दा है। मैंने यह देखने के लिए नहीं देखा कि इसके बारे में कोई बग दायर किया गया है या नहीं। यह दोनों VS2012 और gcc-4.7.2

+0

पर संकलित धन्यवाद। मुझे नहीं पता कि वीएस -2010 ट्रायो के लिए एक प्रतिलिपि बनाने वाला क्यों नहीं बनाता है, लेकिन यह निश्चित रूप से स्पष्ट के बिना संकलित नहीं होगा। मानक के संदर्भ और संदर्भ के लिए – Aaron