2017-06-10 19 views
8

के साथ एक वस्तु का निर्माण:मैं निम्नलिखित वर्ग है एक स्ट्रिंग शाब्दिक

#include <iostream> 
#include <string> 

using namespace std; 

class CLS 
{ 
    int value; 
    string str_value; 

public: 

    CLS(int param) { value = param; } 

    CLS(string param) 
    { 
     str_value = param; 
    } 
}; 

int main() 
{ 
    CLS a(2); 
    CLS b = 3; 
    CLS c("4"); 
    CLS d = "5"; // Error: invalid conversion from 'const char*' to 'int' 
} 

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

क्या स्ट्रिंग अक्षर के साथ निर्माण करना सही है? यदि नहीं, तो क्यों? यदि हां, तो मेरे कोड में क्या गलत है?

मैं कोड :: ब्लॉक 16.1 के साथ जीसीसी 5.3 का उपयोग कर रहा हूं।

+5

मुझे लगता है कि यह VS2017 के तहत ठीक है। यह याद रखना महत्वपूर्ण है कि स्ट्रिंग अक्षर एक 'std :: string' जैसा नहीं है। – Rook

+0

क्या यह एक पूर्ण उदाहरण है? किसी भी शीर्षलेख शामिल थे? आपके मामले में 'स्ट्रिंग' क्या है? – ArturFH

+0

@ आर्टूर आर चेकोव्स्की - यह एक पूर्ण उदाहरण है (मैंने हेडर जोड़े)। मुझे लगता है कि 'स्ट्रिंग' होना चाहिए 'std :: string'। –

उत्तर

11

पहले, "4"std::string नहीं है, यह const char[2] है। फिर

CLS c("4");direct initialization है, CLS के रचनाकारों की c प्रारंभ करने के लिए जांच की जाएगी। CLS::CLS(string) यहां उठाया गया है, क्योंकि const char[] को उपयोगकर्ता द्वारा परिभाषित रूपांतरण (यानी std::string::string(const char*)) के माध्यम से std::string पर स्पष्ट रूप से परिवर्तित किया जा सकता है।

CLS d = "5";, copy initialization है

(जोर मेरा)

  • तो T एक वर्ग प्रकार, और other के प्रकार के सीवी-अयोग्य संस्करण T या T से प्राप्त नहीं है, या यदि T गैर-वर्ग प्रकार है, लेकिन other का प्रकार एक वर्ग प्रकार है, उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम जोके प्रकार से परिवर्तित हो सकते हैंसे T (या T से व्युत्पन्न एक प्रकार के लिए T एक वर्ग प्रकार है और एक रूपांतरण फ़ंक्शन उपलब्ध है) की जांच की जाती है और सबसे अच्छा अधिभार रिज़ॉल्यूशन के माध्यम से चुना जाता है।

उपयोगकर्ता परिभाषित रूपांतरण दृश्यों इसका मतलब है कि CLS को const char[2] कन्वर्ट करने के लिए आवश्यक है। यहां तक ​​कि const char[] को std::string में परिवर्तित किया जा सकता है, और std::string को CLS में परिवर्तित किया जा सकता है, लेकिन एक implicit conversion sequence में केवल एक उपयोगकर्ता-परिभाषित रूपांतरण की अनुमति है। यही कारण है कि इसे खारिज कर दिया गया है।

(जोर मेरा)

अंतर्निहित रूपांतरण अनुक्रम इस क्रम में, निम्न में से होते हैं:

1) शून्य या एक मानक रूपांतरण अनुक्रम;
2) शून्य या एक उपयोगकर्ता द्वारा परिभाषित रूपांतरण;
3) शून्य या एक मानक रूपांतरण अनुक्रम।

बीटीडब्लू: यदि आप इसे std::string का उपयोग करने के लिए बदलते हैं तो प्रारंभकर्ता अभिव्यक्ति स्पष्ट रूप से यह ठीक काम करेगी। जैसे

CLS d = std::string{"5"}; // pass a temporary std::string constructed from "5" to the constructor of CLS 

using namespace std::string_literals; 
CLS d = "5"s;    // "5"s is a string literal of type std::string (supported from C++14) 
+0

तो उपयोगकर्ता द्वारा परिभाषित रूपांतरण आवश्यकता भी अंतर्निहित रूपांतरणों पर लागू होती है? क्योंकि अन्यथा 'const char [2] '-> अंतर्निहित' const char * '-> उपयोगकर्ता द्वारा परिभाषित' std :: string', है ना? – Rakete1111

+0

@ Rakete1111 (1) हां, एक अंतर्निहित रूपांतरण अनुक्रम में केवल एक उपयोगकर्ता द्वारा परिभाषित रूपांतरण की अनुमति है; (2) मैं आपका इरादा नहीं प्राप्त कर सकता, 'कॉन्स्ट चार [2] '->' const char * 'उपयोगकर्ता परिभाषित रूपांतरण नहीं है लेकिन मानक रूपांतरण जो एक से अधिक हो सकता है। – songyuanyao

+0

हां, यह बिल्कुल मेरा मुद्दा है: यदि केवल 1 उपयोगकर्ता परिभाषित रूपांतरण की अनुमति है, तो 'const char [2] '->' const char * 'गिनती नहीं है, और' std :: string' के निर्माता का उपयोग किया जा सकता है (जो 1 उपयोगकर्ता परिभाषित रूपांतरण है)। लेकिन फिर इसकी अनुमति क्यों नहीं है? – Rakete1111

8
CLS a(2); 
CLS b = 3; 
CLS c("4"); 
CLS d = "5"; 

a और cdirect initialisation साथ initialised कर रहे हैं। दूसरी ओर b और dcopy initialisation का उपयोग करें।

अंतर यह है कि प्रति के लिए से (d के मामले में) char const * एक (एकल) उपयोगकर्ता परिभाषित रूपांतरण के लिए संकलक खोजें initialisation (यह एक सा गलत है, इस सवाल का जवाब के अंत देखें) CLS करने, प्रत्यक्ष initialisation के लिए जबकि सभी है रचनाकारों की कोशिश की जाती है, जहां CLS(std::string) का उपयोग किया जा सकता है क्योंकि एक रूपांतरण std::string(char const *) उपलब्ध है।

विवरण:

"5" एक (सी) स्ट्रिंग शाब्दिक है। यह प्रकार char const [2] है। तो सबसे पहले, उपयोगकर्ता ने उस प्रकार से रूपांतरण को CLS पर खोजा है। क्योंकि कोई भी नहीं मिला है, Type[N] से Type * (Type = char const और N = 2) से मानक रूपांतरण लागू होता है, जिसके परिणामस्वरूप char const * होता है। फिर संकलक उपयोगकर्ता से परिभाषित रूपांतरण को CLS पर खोजने का प्रयास करता है। क्योंकि यह एक नहीं मिलता है, और कोई मानक रूपांतरण नहीं है, यह उपलब्ध हो सकता है, संकलन विफल रहता है।

+0

आपका मतलब है "[...] उपयोगकर्ता परिभाषित रूपांतरण (' डी' के मामले में) 'char const [] '[...]"? '5" '' const char * 'को क्षय हो सकता है, लेकिन यह एक 'const char [2]' है। – Rakete1111

+0

@ राकेट 1111 वहां आप जाते हैं, मैंने शुरुआत में जवाबों पर ध्यान केंद्रित करने के लिए उत्तर से बाहर क्षय छोड़ा। –

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