ডেরিভড 1 :: বেস এবং ডেরিভড 2 :: বেস একই ধরণের বোঝায়?


12

এমএসভিসি, কলং এবং জিসিসি এই কোডটিতে একমত নন:

struct Base { int x; };
struct Der1 : public  Base {};
struct Der2 : public  Base {};

struct AllDer : public Der1, public Der2 {
    void foo() {
        Der1::Base::x = 5;
    }
};

Godbolt

জিসিসি:

<source>: In member function 'void AllDer::foo()':    
<source>:10:21: error: 'Base' is an ambiguous base of 'AllDer'    
   10 |         Der1::Base::x = 5;    
      |                     ^    
Compiler returned: 1

ঝনঝন একটি অনুরূপ ত্রুটি দেয় এবং এমএসভিসি কোনও ত্রুটি দেয় না।

এখানে কে?

আমি মনে করি এটি [class.member.lookup] এ আচ্ছাদিত রয়েছে তবে এই ক্ষেত্রে এটি আমাকে কী বলার চেষ্টা করছে তা বুঝতে আমার অসুবিধা হচ্ছে। দয়া করে প্রাসঙ্গিক অংশগুলি উদ্ধৃত করুন এবং সম্ভব হলে সরল ইংরেজিতে ব্যাখ্যা করুন।

পিএস: এই প্রশ্নে অনুপ্রাণিত কেন বেস-ক্লাসের সাথে রেফারেন্সটি :: -অপারেটর ট্রাটেড ক্লাসের সাথে অস্পষ্ট?

পিপিএস: আসলে আমার সন্দেহটি Der1::Baseপ্রকারটিকে বোঝায় কিনা , তা হবে Base(এবং তারপরে Der2::Baseহুবহু একই ধরণের), অথবা সাবোবজেক্টটিতে। আমি নিশ্চিত যে এটি প্রথম, তবে এটি যদি পরে হয় তবে এমএসভিসি ঠিক হবে।



@ ল্যাঙ্গুয়েজলায়ারের আরও ভাল ইঙ্গিত রয়েছে যে জিসিসি এবং ঝনঝন সঠিক, তবে আমি পুরোপুরি নিশ্চিত নই যে এমএসসিভিটি ভুল
আইডাক্ল্যাভ 463035818

1
স্পষ্টতই উভয়ই একই ধরণের উল্লেখ করে ::Baseতবে আসল প্রশ্নটি এখানে কিছুটা আলাদা বলে মনে হচ্ছে। দুটি ধরণের সাবওবজেক্ট রয়েছে Baseএবং উভয়েরই Base::x সদস্য রয়েছে।
এমসাল্টারস

@ এসএমএস পিটারগুলি কেবল আমার বিভ্রান্তি প্রকাশ করে। যদি আপনার কাছে আরও ভাল শিরোনামের জন্য নির্দ্বিধায় কোনও পরামর্শ দেওয়া থাকে তবে আমি নিজে এটি পছন্দ করি না (কারণ আমি জানি উত্তরটি হ্যাঁ) তবে এর চেয়ে আরও উপযুক্ত কিছু খুঁজে পেল না
idclev 463035818

1
@ d4rk4ng31 কোডে কোনও ভার্চুয়াল উত্তরাধিকার নেই (উদ্দেশ্য অনুসারে)
idclev 463035818

উত্তর:


6

শিরোনামে প্রশ্নের উত্তর দেওয়ার জন্য, হ্যাঁ, Derived1::Baseরেফারেন্স ইনজেকশনের ক্লাসের-নাম [class.pre] Base এবং তাই করে Derived2::Base। উভয়ই ক্লাসকে বোঝায় ::Base

এখন, যদি Baseকোনও স্থিতিশীল সদস্য থাকে x, তবে অনুসন্ধানটি Base::xদ্ব্যর্থহীন হবে। সেখানে মাত্র একটি.

এই উদাহরণটিতে সমস্যাটি হ'ল এটি xএকটি অ স্থিতিশীল সদস্য এবং AllDerএর মধ্যে দুটি সদস্য রয়েছে। আপনি কেবলমাত্র এক সদস্য থাকতে পারে এমন xএকটি দ্ব্যর্থহীন বেস ক্লাস নির্দিষ্ট করে এই ধরণের অ্যাক্সেসকে ছত্রভঙ্গ করতে পারেন । দ্ব্যর্থহীন বেস ক্লাস, এবং এটির একটি সদস্য রয়েছে, সুতরাং আপনার দু'জন সদস্যের মধ্যে কোনটি বোঝাতে চান তা নির্বিঘ্নভাবে নির্দিষ্ট করে । খুব মাত্র একটি সদস্য আছে, তবে এটি একটি দ্ব্যর্থহীন বেস নয় । প্রতিটি উদাহরণে দুটি উপ-অবজেক্ট রয়েছে । সুতরাং আপনার উদাহরণে অস্পষ্ট। এবং যেহেতু কেবল অন্য নাম , এটি অস্পষ্ট রয়ে গেছে।AllDerxDerived1xDerived1::xxAllDerBasexAllDerAllDerBaseBase::xDerived1::BaseBase

[class.member.lookup] নির্দিষ্ট করে যা xনেস্টেড-নাম-নির্দিষ্টকরণকারীর প্রসঙ্গে দেখা যায়, যাতে প্রথমে সমাধান করতে হবে। আমরা প্রকৃতপক্ষে সন্ধান করছি Base::x, না Derived1::x, কারণ আমরা সমাধান Derived1::Baseহিসাবে শুরু করেছি Base। এই অংশটি সফল হয়, [ক্লাস.মেমবার.লুকআপ] xএর Base.নোট 12-এ কেবল একটিই আপনাকে স্পষ্টভাবে বলেছে যে same একই নামের একাধিক সাবওবজেক্ট থাকা অবস্থায় একটি দ্ব্যর্থহীন নাম অনুসন্ধান করা এখনও ব্যর্থ হতে পারে। D::iউদাহরণস্বরূপ আপনার হয় Base::x


সুতরাং এটি কেবল "ব্যর্থ হতে পারে" তবে "অবশ্যই ব্যর্থ হবে" এবং তিনটি সংকলকই ঠিক আছে? উদাহরণস্বরূপ বিবেচনা করুন template <typname A,typename B> struct foo : A,Bএকটি Aএবং এর বেসের সদস্যদের অ্যাক্সেসের জন্য কিছু স্বীকৃত কোড সহ B। এই ক্ষেত্রে আমি একটি ত্রুটি পেতে চাই
idclev 463035818

1
@ idclev463035818: আমার সন্দেহ হয় এটি একটি "অবশ্যই ব্যর্থ" ডায়াগনস্টিক প্রয়োজন । বিশেষত, এটি 7.6.1.4/7 ক্লাস সদস্যের অ্যাক্সেসে ব্যর্থ হয়, "দূষিত"।
এমসাল্টারস

আমাকে আরও কিছুটা পড়তে হবে। এবং আমাকে এমএসভিসি নিয়ে কিছু গবেষণা করতে হবে, আমি সন্দেহ করি যে পুরোপুরি কমপ্লায়েন্ট আউটপুট পেতে কিছু পতাকা প্রয়োজন, তবে কোন পতাকাগুলি খুঁজে বের করতে হবে
idclev 463035818

2

ক্লাসের সদস্য হিসাবে ক্লাসের নামটি উল্লেখ করার কারণটি হ'ল সিপিপি সুবিধাজনক ব্যবহারের জন্য এটির মতো করে রাখে, যেমন আপনি using Base = ::Base;বেসের ভিতরে লিখেছেন ।
আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা Der1::Baseহ'ল Base
এইভাবে, আপনি যখন লিখবেন Der1::Base::x, এটি একইরকম Base::x


আমি জানি "সমস্যা" কি তবে আপনি আমার প্রশ্নের উত্তর দিচ্ছেন না: "কে সঠিক? (এবং কেন?)"
idclev 463035818

@ idclev463035818: আমি বিশ্বাস করি এটি ডান দিক। অংশটি usingস্ট্যান্ডার্ডে রচিত এবং আমি মনে করি এটিই কী অভিব্যক্তি বলে তা ব্যাখ্যা করার মূল চাবিকাঠি।
দানি

@ idclev463035818: নীচের উদাহরণটি দেখুন। আমি মনে করি এটি কিছুটা সাফ হয়ে যাবে। ideone.com/IqpXjT
দানি

দুঃখিত তবে আমি মনে করি আপনি আমার প্রশ্নের বিন্দুটি পান না। আমি স্ট্যান্ডার্ড অনুযায়ী সঠিক কি তা জানতে চাই, কারণ আমি দেখতে পাই বিভিন্ন সংকলক বিভিন্ন কাজ করে। একটি নির্দিষ্ট সংকলক একটি বিশেষ উদাহরণে কী করে তা দেখে, প্রশ্নের উত্তর দিতে সাহায্য করে না
idclev 463035818

শুধু এফওয়াইআই, এমএসভিসি (x64 এর জন্য 19.25.28614 ver) আপনার আদর্শটি আইডোন.আইকিপিএক্সজেটি সংকলন করতে ব্যর্থ হয়েছে । cl /c /Wall /WX /Od /MDd /Za /permissive- /std:c++17 main.cppএর কমান্ড লাইন হিসাবে ব্যবহার করে আমি পেয়েছিmain.cpp(7): error C2597: illegal reference to non-static member 'A::x'
উত্তীর্ণ হয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.