ক্ল্যাং কি কোড প্রত্যাখ্যান করার ক্ষেত্রে সঠিক, যেখানে কোনও শ্রেণিবদ্ধ টেমপ্লেটের নেস্টেড ক্লাসটি কেবল বিশেষায়নের মাধ্যমে সংজ্ঞায়িত করা হয়?


17

নিম্নলিখিত শ্রেণীর টেমপ্লেট দেওয়া হয়েছে:

template<typename T>
struct Outer
{
    struct Inner;

    auto f(Inner) -> void;
};

আমরা Innerপ্রতিটি বিশেষজ্ঞের জন্য পৃথকভাবে সংজ্ঞায়িত করি Outer:

template<>
struct Outer<int>::Inner {};

template<>
struct Outer<double>::Inner {};

এবং তারপরে fসমস্ত বিশেষত্বের জন্য একবার সদস্য ক্রিয়া সংজ্ঞায়িত করুন Outer:

auto Outer<T>::f(Inner) -> void
{

}

তবে কলং অভিযোগ (9.0.0):

error: variable has incomplete type 'Outer::Inner'

auto Outer<T>::f(Inner) -> void

                      ^

এর Innerঅন্যান্য সমস্ত বিশেষত্বের জন্য একটি সংজ্ঞা প্রদান করে আমরা সংকলক ত্রুটি থেকে রক্ষা পেতে পারি Outer:

template<typename T>
struct Outer<T>::Inner {};

বা fপ্রতিটি বিশেষজ্ঞের জন্য পৃথকভাবে সংজ্ঞায়িত করে :

template<>
auto Outer<int>::f(Inner) -> void
{

}

template<>
auto Outer<double>::f(Inner) -> void
{

}

জিসিসি এবং এমএসভিসি উভয়ই প্রাথমিক কোডটি গ্রহণ করে, যা প্রশ্নটি উত্থাপন করে; এটি কি একটি কলং বাগ বা এটি তিনটির মধ্যে একমাত্র কার্যকর প্রয়োগ?

সংকলক এক্সপ্লোরার চেষ্টা করুন


অভ্যন্তরের বিশেষীকরণগুলি অপ্রাসঙ্গিক, এগুলি সরিয়ে ফেললে সংকলনের ফলাফল পরিবর্তন হয় না।
এন। 'সর্বনাম' মি।

@ n.'pronouns'm। আপনি কি বোঝাতে চাচ্ছেন তা আমি নিশ্চিত নই. উভয়ই অন্যান্য সমস্ত বিশেষত্বের জন্য একটি সংজ্ঞা যুক্ত করেInner এবং প্রতিটি বিশেষীকরণের জন্য পৃথকভাবে সংজ্ঞাf সংকলনের ত্রুটি সমাধান করে resolve
invexed

আসুন এটি আবার পড়ুন: এগুলি সরানো সংকলনের ফলাফলকে পরিবর্তন করে না । যোগ করা হচ্ছে না, সরানো হচ্ছে না। gcc ঝাঁকুনি
এন। 'সর্বনাম' মি।

@ n.'pronouns'm। আপনি এখন যা বলতে চাইছেন তা আমি দেখতে পেয়েছি তবে এটি করা এখনও একটি অদ্ভুত মন্তব্য। আমার প্রশ্নের মূল Innerবক্তব্যটি ছিল প্রতিটি Outerপ্রদত্ত বিশেষায়নের সংজ্ঞা থাকা সত্ত্বেও এটি একটি অসম্পূর্ণ প্রকার হিসাবে রিপোর্ট করা হচ্ছে। Innerআপনি এর সংজ্ঞা (গুলি) সরিয়ে দিলে স্পষ্টতই (সঠিকভাবে) একটি অসম্পূর্ণ প্রকার হবে।
ইনভেক্সড

"আপনি যদি এর সংজ্ঞা (গুলি) মুছে ফেলেন তবে স্পষ্টভাবে অভ্যন্তরটি একটি অসম্পূর্ণ প্রকার হবে" "না এটি" মোটেও সিদ্ধ নয় A একটি বিশেষীকরণ একটি সম্পূর্ণ পৃথক টেম্পলেট এবং এটি মূল টেমপ্লেটকে মোটেই প্রভাবিত করে না
এন। 'সর্বনাম' মি।

উত্তর:


4

আমি বিশ্বাস করি যে আপনার কোডটি প্রত্যাখ্যান করার জন্য কলং ভুল। আমাদের নিজেদের জিজ্ঞাসা করতে হবে, আপনার ফাংশন ঘোষণা এবং সংজ্ঞা কিভাবে তুলনা করে

auto f(typename T::Inner) -> void;

// ...

template<typename T>
auto Outer<T>::f(typename T::Inner) -> void
{ }

এই উদাহরণে, T::Innerঅবশ্যই একটি নির্ভরশীল প্রকার। সুতরাং ঝনঝন এটি ইনস্ট্যান্টেশন অবধি অসম্পূর্ণ বলে ধরে নিতে পারে না। একই উদাহরণ কি আপনার উদাহরণে সত্য? আমি তাই বলব। কারণ আমাদের এটি স্ট্যান্ডার্ডে রয়েছে:

[Temp.dep.type]

5 একটি নাম বর্তমান ইনস্ট্যান্টেশনের সদস্য হলে তা হয়

  • একটি অযোগ্য নাম যা দেখলে দেখা যায় যে কোনও শ্রেণীর কমপক্ষে একজন সদস্যকে বোঝায় যা হ'ল বর্তমান ইনস্ট্যান্টেশন বা এর উপর নির্ভরশীল বেস শ্রেণি নেই। [দ্রষ্টব্য: এটি কেবল তখনই ঘটতে পারে যখন কোনও শ্রেণীর টেম্পলেটের সংজ্ঞা দ্বারা আবদ্ধ কোনও স্কোপের কোনও নাম অনুসন্ধান করা হয়। - শেষ নোট]
  • ...

একটি নাম বর্তমান ইনস্ট্যান্টিশনের একটি নির্ভরশীল সদস্য, যদি এটি বর্তমান ইনস্ট্যান্টেশনের সদস্য হয় যা যখন দেখা হয়, তখন কোনও শ্রেণীর কমপক্ষে একজন সদস্যকে বোঝায় যা বর্তমান ইনস্ট্যান্টেশন।

9 একটি প্রকার নির্ভরশীল যদি তা হয়

  • ...
  • অজানা বিশেষজ্ঞের একজন সদস্য,
  • একটি নেস্টেড বর্গ বা গণনা যা বর্তমান ইনস্ট্যান্টিশনের নির্ভরশীল সদস্য,
  • ...

সুতরাং অনুচ্ছেদ 9-এ প্রথম বুলেটটি কেসটি কভার করে typename T::Inner। এটি একটি নির্ভরশীল প্রকার।

ইতিমধ্যে আপনার মামলাটি দ্বিতীয় বুলেট দ্বারা আচ্ছাদিত। Outer::Innerএটি এমন একটি নাম যা বর্তমান তাত্ক্ষণীতে পাওয়া যায় Outer, তদুপরি এটি নিজের অভ্যন্তরেও পাওয়া Outerযায়, বেস ক্লাসে নয়। এটি এটিকে বর্তমান ইনস্ট্যান্টের একটি নির্ভরশীল সদস্য করে তোলে। এই নামটি নেস্টেড ক্লাসকে বোঝায়। যার অর্থ দ্বিতীয় বুলেটের সমস্ত শর্তাবলী প্রযোজ্য, এভাবে Outer::Innerনির্ভরশীল প্রকারটিও তৈরি করে !

যেহেতু উভয় ক্ষেত্রেই আমাদের নিজেদের একটি নির্ভরশীল প্রকার রয়েছে, সংকলকরা তাদের সমানভাবে নির্ভরশীল ধরণের হিসাবে আচরণ করবে। আমার উপসংহারটি হ'ল জিসিসি এবং এমএসভিসি সঠিক।


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