ত্রুটি: মুছে ফাংশন ব্যবহার


121

আমি এমন কিছু সি ++ কোড নিয়ে কাজ করছি যা কোনও বন্ধু লিখেছিল এবং আমি নিম্নলিখিত ত্রুটিটি পেয়েছি যা আমি আগে কখনও দেখিনি জিসিসি ৪..6 সহ সংকলন করার সময়:

error: use of deleted function

GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h

সম্পাদনা করুন: এটি বুস্ট এমএসএম: বুস্ট ওয়েবপেজ ব্যবহার করে কোডের একটি অংশ থেকে আসে

সম্পাদনা 2: = delete()সোর্সকোডে কোথাও কোনও ব্যবহার নেই ।

সাধারণভাবে বলতে গেলে এই ত্রুটির অর্থ কী? এই ধরণের ত্রুটি দেখা দিলে আমি কী খুঁজছি?


4
এবং আপনি কোডটি সংকলন করছেন?
কল

আমি আরও ভাবছিলাম ত্রুটিটি কী বোঝায়? আমারও কি সেই জন্য কোড পোস্ট করার দরকার আছে?
শাটল May87

1
gcc.gnu.org/bugzilla/show_bug.cgi?id=47417 সাহায্য করতে পারে, আপনি কি বুস্ট ব্যবহার করছেন?
কল

@ স্যাসকিহা, হ্যাঁ আমি এমএসএম-এর বস্ট ব্যবহার করছি।
শাটল May87

20
যেহেতু এটি এই ধরণের ত্রুটির জন্য প্রথম গুগল ম্যাচ হিসাবে আসে - এখানে কেস নয়, তবে এই ধরণের ত্রুটির সর্বাধিক সাধারণ কারণ আপনি কোনও ক্লাসে কিছু কাস্টম কনস্ট্রাক্টর যুক্ত করার পরে রয়েছে - ফলস্বরূপ সংকলকটি ডিফল্ট নির্মাণকারী তৈরি করা বন্ধ করে দেয় , এবং যদি শ্রেণীর কোনও উদাহরণ ডিফল্ট নির্মাণকারীর মাধ্যমে তৈরি করা হয় তবে এই ত্রুটিটি উপস্থিত হয়। কেবল স্পষ্টভাবে ডিফল্ট নির্মাণকারী যুক্ত করুন।
এসএফ

উত্তর:


170

ত্রুটি বার্তায় স্পষ্টভাবে বলা হয়েছে যে ডিফল্ট কনস্ট্রাক্টর পুরোপুরি মুছে ফেলা হয়েছে । এমনকি এমনকি এটিও বলেছেন: শ্রেণিতে একটি অ-স্থিতিশীল, কনস্ট ভেরিয়েবল রয়েছে, যা ডিফল্ট কর্টর দ্বারা আরম্ভ করা হবে না।

class X {
    const int x;
};

যেহেতু X::xহয় const, এটা সক্রিয়া হবে - কিন্তু একটি ডিফল্ট ctor স্বাভাবিকভাবে এটা শুরু করা হবে (কারণ এটি একটি শুঁটি ধরনের)। সুতরাং, একটি ডিফল্ট কর্টর পেতে, আপনাকে নিজের একটি নির্দিষ্ট করতে হবে (এবং এটি অবশ্যই শুরু করতে হবে x)। আপনি কোনও সদস্যের সাথে একই ধরণের পরিস্থিতি পেতে পারেন যা একটি রেফারেন্স:

class X { 
    whatever &x;
};

সম্ভবত এটি লক্ষণীয় যে এগুলি উভয়ই মূলত একই কারণে একটি অ্যাসাইনমেন্ট অপারেটরের অন্তর্নিহিত সৃষ্টিকেও অক্ষম করবে। অন্তর্নিহিত অ্যাসাইনমেন্ট অপারেটর সাধারণত সদস্য-ভিত্তিক অ্যাসাইনমেন্ট করে তবে কোনও কনস্টের সদস্য বা রেফারেন্স সদস্যের সাথে, এটি এটি করতে পারে না কারণ সদস্যকে বরাদ্দ করা যায় না। অ্যাসাইনমেন্টের কাজ করার জন্য আপনার নিজের অ্যাসাইনমেন্ট অপারেটরটি লিখতে হবে।

এ কারণেই কোনও constসদস্যের সাধারণত স্থিতিশীল হওয়া উচিত - আপনি যখন কোনও অ্যাসাইনমেন্ট করেন, আপনি কোনওভাবেই কনস্ট সদস্যকে বরাদ্দ করতে পারবেন না। একটি সাধারণ ক্ষেত্রে আপনার সমস্ত দৃষ্টান্তের একই মান হতে চলেছে যাতে তারা ভেরিয়েবলের প্রচুর অনুলিপি না রেখে একক ভেরিয়েবলের অ্যাক্সেস ভাগ করে নিতে পারে যা সকলেরই একই মান।

অবশ্যই বিভিন্ন মান সহ উদাহরণস্বরূপ তৈরি করা সম্ভব - যদিও আপনি বস্তুটি তৈরি করার সময় আপনি (উদাহরণস্বরূপ) একটি মান পাস করেন, সুতরাং দুটি পৃথক বস্তুর দুটি পৃথক মান থাকতে পারে। তবে, আপনি যদি এগুলি অদলবদলের মতো কিছু করার চেষ্টা করেন তবে কনস্ট সদস্যটি অদলবদলের পরিবর্তে এর মূল মানটি ধরে রাখবেন।


@ জেফ্রি কফিন: আসল ত্রুটি বার্তাটি সম্পাদনা হিসাবে পোস্ট করা হয়েছিল, প্রাথমিক ত্রুটি বার্তা পোস্ট করা হয়েছিলC++ error: use of deleted function
অলোক

1
@ অলস: দুঃখিত, আমার সম্ভবত স্পষ্ট হওয়া উচিত ছিল যে আমি এই আদেশের উপর অপমান বা কিছুই হিসাবে অভিপ্রায় জানাতে চাইনি, বর্তমানে যা পাওয়া যায় তা প্রমাণ করে যে এই উত্তরগুলি সঠিক ছিল না।
জেরি কফিন

কোনও সমস্যা নেই, আমি দৃ ad় হতে চাইনি ... আপনার উত্তরটি দুর্দান্ত এবং পরিস্থিতিটি সর্বোত্তমভাবে ব্যাখ্যা করে। আমার কাছ থেকে +1 :)
অলোক

আমি ধরে নিয়েছি আপনি আমার সমস্যার সমাধান করতে এখানে আমাকে সহায়তা করতে পারেন দয়া করে: stackoverflow.com/questions/23349524/…
সাহের আহওয়াল

2
@ অলিফোর্ড: এটি নির্ভর করে। (উদাহরণস্বরূপ) আপনি যদি সেই ক্ষেত্রের একটি মান সহ কোনও বস্তুকে অন্য ক্ষেত্রে সেই ক্ষেত্রের আলাদা মান দিয়ে থাকেন তবে কী হবে? যদি এটি ওভাররাইট করা উচিত, তবে এটি কনস্ট হতে পারে না। যদি একেবারেই অনুমতি না দেওয়া হয়, তবে মানটি প্রকৃতপক্ষে প্রকারের অংশ হতে পারে (উদাহরণস্বরূপ, টেমপ্লেট পরামিতি, সংকলনের সময় জানা থাকলে)।
জেরি কফিন

11

আপনি একটি ফাংশন ব্যবহার করছেন, যা হিসাবে চিহ্নিত করা হয়েছে deleted
উদাহরণ:

int doSomething( int ) = delete;

= মুছে ফেলা সি ++ 0x এর একটি নতুন বৈশিষ্ট্য। এর অর্থ হ'ল সংকলকটির তাত্ক্ষণিকভাবে সংকলন বন্ধ করা উচিত এবং ব্যবহারকারী যখন এই জাতীয় ফাংশনটি ব্যবহার করেন তখন "এই ফাংশনটি মুছে ফেলা হয়" complain

আপনি যদি এই ত্রুটিটি দেখতে পান তবে আপনার জন্য ফাংশন ঘোষণাটি পরীক্ষা করা উচিত =delete

সি ++ 0x চালু এই নতুন বৈশিষ্ট্য ব্যাপারে আরো জানতে, চেক এই বাইরে।


7
কৌতূহলের বাইরে, কখন এরকম কিছু করা সহায়ক হবে?
পেপে

@ পিটার: অন্তর্নিহিত রূপান্তরগুলি রোধ করতে।
আর মার্টিনহো ফার্নান্দিস

7
আসলে এটি " স্পষ্টতই মোছা কারণ ..." বলে , উপরের উদাহরণটি সুস্পষ্ট হবে be
জর্জি ফ্রিত্শে

: @Peter আর: এই মত দেখাচ্ছে একটি উদাহরণ en.wikipedia.org/wiki/...
shuttle87

1
@ ডাউনভোটার: আসল ত্রুটি বার্তাটি সম্পাদনা হিসাবে পোস্ট করা হয়েছিল, প্রাথমিক ত্রুটি বার্তাটি পোস্ট করা হয়েছিলC++ error: use of deleted function
অলোক

4

gcc 4.6 মুছে ফেলা ফাংশনগুলির একটি নতুন বৈশিষ্ট্য সমর্থন করে, যেখানে আপনি লিখতে পারেন

hdealt() = delete;

ডিফল্ট কনস্ট্রাক্টর অক্ষম করতে।

এখানে সংকলক স্পষ্টতই দেখেছেন যে কোনও ডিফল্ট নির্মাণকারী তৈরি করা যায় না এবং =deleteএটি আপনার জন্য।


2

বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে এবং আমার সাবক্লাসে সমস্ত খাঁটি ভার্চুয়াল পদ্ধতি প্রয়োগ না করার সময় আমি এই ত্রুটির মুখোমুখি হয়েছি।


1
একইভাবে, আমি public virtualদ্বিতীয়-স্তরের বেস শ্রেণি থেকে প্রাপ্ত হয়ে একই পেয়েছি যেখানে প্রথম স্তরের বেস শ্রেণিতে স্পষ্টভাবে মুছে ফেলা ডিফল্ট কনস্ট্রাক্টর ছিল। সরানো হচ্ছে virtualসব পদ্ধতি বাস্তবায়ন করেও সমস্যা সমাধান করা হয়েছে।
মাইত্রে বার্ট

1

বর্তমান সি ++ 0 এক্স স্ট্যান্ডার্ডে আপনি মুছে ফেলা সিনট্যাক্সের সাথে স্পষ্টভাবে ডিফল্ট নির্মাতাদের অক্ষম করতে পারেন, যেমন eg

MyClass() = delete;

জিসিসি 4.6 হ'ল এই বাক্য গঠনটি সমর্থন করার জন্য প্রথম সংস্করণ, তাই সম্ভবত এটিই সমস্যা ...


Gcc 4.6 is the first version to support this syntaxআমি অনুমান করি যে এটি সবেমাত্র gcc4.6 ব্যবহার করা শুরু করার সাথে আমি কেন আগে কখনও এটি দেখিনি explain
শাটল May87

2
আমি বছর বছর ধরে এই সিনট্যাক্সটি জিসিসি 4.5 দিয়ে ব্যবহার করে আসছি। মানে দিনগুলি।
আর মার্টিনহো ফার্নান্দেস

আহ, আমি অবশ্যই জিএসসির ৪.6-তে থাকা প্রতিনিধিদের সম্পর্কে ভাবছিলাম।
জারমন্ড

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