समसामयिक तार अपेक्षा के अनुरूप काम नहीं करते [बंद]


84

मुझे पता है कि यह एक सामान्य मुद्दा है, लेकिन संदर्भ और अन्य सामग्री की तलाश में मुझे इस सवाल का स्पष्ट जवाब नहीं मिलता है।

निम्नलिखित कोड पर विचार करें:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

संकलक मुझे बताता है कि इसके लिए एक अतिभारित ऑपरेटर नहीं मिल सकता है char[dim]

क्या इसका मतलब यह है कि स्ट्रिंग में एक + ऑपरेटर नहीं है?

लेकिन कई उदाहरणों में इस तरह की स्थिति है। यदि यह अधिक तारों को समतल करने का सही तरीका नहीं है, तो सबसे अच्छा तरीका क्या है?


15
आपका कोड बस ठीक संकलित करना चाहिए, जिसका अर्थ है कि आप सटीक कोड नहीं दिखा रहे हैं जो त्रुटि का कारण बनता है (सटीक त्रुटि संदेश पोस्ट नहीं करने के शीर्ष पर)।
sbi

वैसे यह काम नहीं करता है ... शायद मेरी गलती यह है कि मैंने संकलक प्रदान नहीं किया ... यह जी ++ नहीं वीसी है ... :)
एंड्री

जवाबों:


153

आपका कोड, जैसा कि लिखा गया है, काम करता है। आप शायद असंबंधित कुछ हासिल करने की कोशिश कर रहे हैं, लेकिन इसी तरह:

std::string c = "hello" + "world";

यह काम नहीं करता क्योंकि C ++ के लिए ऐसा लगता है जैसे आप दो charपॉइंटर्स जोड़ने की कोशिश कर रहे हैं । इसके बजाय, आपको कम से कम एक शाब्दिक को एक में बदलने की आवश्यकताchar* है std::string। या तो आप वह कर सकते हैं जो आपने पहले ही प्रश्न में पोस्ट किया है (जैसा कि मैंने कहा, यह कोड काम करेगा ) या आप निम्नलिखित कार्य करते हैं:

std::string c = std::string("hello") + "world";

3
char * एक सूचक है, और इसे केवल इसलिए नहीं जोड़ा जा सकता क्योंकि इसमें मेमोरी के आवंटन की आवश्यकता होती है। std :: strings आबंटन छिपाते हैं, इस कारण उनके लिए एक ऑपरेटर + प्रदान करना संभव है।
विंसेंट रॉबर्ट

12
@Andry: इसका कारण यह नहीं है कि C ++ अपने स्ट्रिंग लिटरल्स को C से विरासत में मिला है, यही वजह है कि वे टाइप const char[]के बजाय, के हैं std::string। सी में (और इसलिए सी ++ में भी) बहुत आसानी से संकेत करने के लिए क्षय को रोकता है, यही कारण है कि "a" + "b" अंतर्निहित ऑपरेटर को आमंत्रित करेगा जो दो बिंदुओं को जोड़ता है। उस का परिणाम (एक सूचक स्मृति में कहीं इंगित करता है) बेशक बहुत बेकार है, लेकिन फिर भी यह वही है जिसके साथ हम फंस गए हैं।
भारतीय स्टेट बैंक

2
@Andry: उचित लेकिन गलत। आवंटन का इससे कोई लेना-देना नहीं है। @Sbi द्वारा दिया गया स्पष्टीकरण सही है (इस तथ्य के अलावा कि एक पॉइंटर जोड़ का परिणाम एक और पॉइंटर नहीं है - दो बिंदुओं को जोड़ना केवल असंभव है, क्योंकि परिणाम अर्थहीन होगा)।
कोनराड रुडोल्फ

1
इसके अतिरिक्त, सीधे आसन्न स्ट्रिंग शाब्दिक संकलक द्वारा स्वचालित रूप से समेटे हुए होते हैं। std::string c = "Hello" "world";, उदाहरण के लिए, में परिणाम होगा c == "Helloworld"
फेंग

1
आप स्ट्रिंग शाब्दिक का उपयोग भी कर सकते हैं: std;:string c = "hello"s + "world"s;या उनमें से एक बना सकते हैं std::string
Rakete1111



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.