প্রতিবন্ধী স্ট্রিং প্রত্যাশার মতো কাজ করে না [বন্ধ]


84

আমি জানি এটি একটি সাধারণ সমস্যা, তবে রেফারেন্স এবং অন্যান্য উপাদানগুলির সন্ধান আমি এই প্রশ্নের সুস্পষ্ট উত্তর খুঁজে পাই না।

নিম্নলিখিত কোড বিবেচনা করুন:

#include <string>

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

সংকলকটি আমাকে বলে যে এটি কোনও ওভারলোডেড অপারেটরটি খুঁজে পায় না char[dim]

তার মানে কি স্ট্রিংটিতে + অপারেটর নেই?

তবে বেশ কয়েকটি উদাহরণে এইরকম পরিস্থিতি রয়েছে। যদি আরও স্ট্রিংগুলি সংঘবদ্ধ করার সঠিক উপায় না হয় তবে সবচেয়ে ভাল উপায় কী?


15
আপনার কোডটি ঠিক জরিমানা সংকলন করা উচিত, যার অর্থ আপনি সঠিক কোডটি প্রদর্শন করছেন না যা ত্রুটি সৃষ্টি করে (সঠিক ত্রুটির বার্তা পোস্ট না করার শীর্ষে)।
এসবিআই

ভাল এটি কাজ করে না ... সম্ভবত আমার দোষটি হ'ল আমি সংকলক সরবরাহ করিনি ... এটি জি ++ ভিসি নয় ... :)
অ্যান্ড্রি

উত্তর:


153

আপনার কোড, লিখিত হিসাবে, কাজ করে। আপনি সম্ভবত সম্পর্কিত নয় এমন কিছু অর্জন করার চেষ্টা করছেন তবে:

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

এটি কাজ করে না কারণ সি ++ এর জন্য দেখে মনে হচ্ছে আপনি দুটি charপয়েন্টার যুক্ত করার চেষ্টা করছেন । পরিবর্তে, আপনাকে কমপক্ষে একটি আক্ষরিককে একটিতে রূপান্তর করতে হবে । হয় আপনি যে প্রশ্নটিতে ইতিমধ্যে পোস্ট করেছেন তা করতে পারেন (যেমন আমি বলেছি, এই কোডটি কার্যকর হবে ) অথবা আপনি নিম্নলিখিতটি করেন:char*std::string

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

4
চর * একটি পয়েন্টার, এবং কেবল মেমরির বরাদ্দ প্রয়োজন কারণ এটি যুক্ত করা যায় না। std :: স্ট্রিংগুলি বরাদ্দ আড়াল করে, এ কারণেই তাদের জন্য একটি অপারেটর সরবরাহ করা সম্ভব।
ভিনসেন্ট রবার্ট

12
@ অ্যান্ড্রি: এটি কাজ না করার কারণটি হ'ল সি ++ সি এর স্ট্রিং লিটারেল উত্তরাধিকার সূত্রে পেয়েছে, এ কারণেই তারা এগুলির const char[]পরিবর্তে প্রকারের std::string। সিতে (এবং সেইজন্যে সি ++ তেও) বিন্যাসগুলি খুব সহজেই পয়েন্টারগুলিতে ক্ষয় হয়, যে কারণে "" "" বি "বিল্ট-ইন অপারেটরকে অনুরোধ করবে যা দুটি পয়েন্টার যুক্ত করে। এর ফলাফল (স্মৃতিতে কোথাও একটি পয়েন্টার নির্দেশ করে) অবশ্যই যথেষ্ট অকেজো, তবে তবুও এটিই আমরা আটকে রয়েছি।
এসবিআই

4
@ এন্ড্রি: যুক্তিসঙ্গত তবে ভুল। বরাদ্দ এর সাথে কিছুই করার নেই। @ এসবিআই দ্বারা প্রদত্ত ব্যাখ্যাটি সঠিক একটি (পয়েন্টার সংযোজনের ফলাফল অন্য পয়েন্টার নয় - এটি ছাড়া দুটি পয়েন্টার যুক্ত করা অসম্ভব, যেহেতু ফলাফলটি অর্থহীন হবে)।
কনরাড রুডল্ফ

4
অতিরিক্তভাবে, সরাসরি সংলগ্ন স্ট্রিং লিটারালগুলি স্বয়ংক্রিয়ভাবে সংকলক দ্বারা সংক্ষিপ্ত হয়ে যায়। std::string c = "Hello" "world";উদাহরণস্বরূপ, ফলাফল হবে c == "Helloworld"
ফ্যাং

4
আপনি স্ট্রিং লিটারেলও ব্যবহার করতে পারেন: std;:string c = "hello"s + "world"s;বা কেবল তাদের একটি তৈরি করুন std::string
Rakete1111

46
std::string a = "Hello ";
a += "World";

4
আমার যদি উক্ত অভ্যাসগুলি ছেড়ে যায় তবে +1 হবে!
jwueller

দুঃখিত এটির সি ++ সি # আই + = এটি এখানে কাজ করে না, যার জন্য এটি ব্যবহৃত হয়
প্রতীক



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.