কোনও শ্রেণি টেম্পলেটে স্থিতিশীল সদস্যের সূচনা


148

আমি এটি করতে চাই:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

তবে আমি যেহেতু something_relevantঅবিচ্ছেদ্য ধরণের নয় তা পারি না । এটি নির্ভর করে না T, তবে বিদ্যমান কোডটি এর স্ট্যাটিক সদস্য হওয়ার উপর নির্ভর করে S

এস যেহেতু টেম্পলেট তাই আমি সংকলিত ফাইলের মধ্যে সংজ্ঞাটি রাখতে পারি না। আমি কীভাবে এই সমস্যার সমাধান করব?


এছাড়াও std::stringপ্রকারভেদে প্রযোজ্য
ট্রেভর বয়ড স্মিথ

যেহেতু সি ++ 11 কীওয়ার্ড ইনলাইন পরিবর্তন হয়েছে তাই স্থির ভেরিয়েবলগুলি ঘোষণার স্থানে আরম্ভ করা যায়। সুতরাং এর জন্য ঘোষণাপত্রটি "ইনলাইন স্ট্যাটিক ডাবল কিছুর_ সম্পর্কিত" 1.5% এর মতো হবে;

@ ব্যবহারকারী 8991265 আমি বিশ্বাস করি যে ইনলাইন ভেরিয়েবলগুলি সি ++ 17 থেকে পাওয়া যায়, সি ++ 11 নয়।
zupazt3

উত্তর:


195

এটি কেবল শিরোনামে সংজ্ঞায়িত করুন:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

যেহেতু এটি কোনও টেম্পলেটটির অংশ, সমস্ত টেম্পলেটগুলির মতো সংকলকও নিশ্চিত করবে যে এটি কেবল একবার সংজ্ঞাযুক্ত।


4
@ এসবিআই: এটি একটি সংজ্ঞা বিধি লঙ্ঘন করে না?
আলেকজান্দ্রি সি

7
না, যদি আমরা টেম্পলেটগুলি কথা বলি না। অন্যথায় ফাংশন টেমপ্লেটগুলিও তাই করবে।
এসবিআই

1
@ এসবিআই, @ প্রসূন: আসলে প্রসূন প্রথম বলে মনে হচ্ছে। ওডিআর সম্পর্কে মন্তব্য করার কারণে আমি এখনও এসবিআই-র গ্রহণ করি (যা আমার প্রাথমিক উদ্বেগ ছিল)।
আলেকজান্দ্রি সি

1
@ এসবিআই এই পাঠ্যের উপরে কেবল ঘোরাবেন :)
জোহানেস স্কাউব -

5
@ জোহানেস: দাম্মিত, আমি এক বছরের জন্য এখানে আছি এবং আমি তা জানতাম না! আমি আর কি মিস করছি? (আমি এখনও লজ্জার কথা স্মরণ করি যখন আমি আবিষ্কার করি যে আমি ভোটের সংখ্যার উপর ক্লিক করলে যে দুটি সংখ্যা উপস্থিত হয় তা কোনও বাগ নয়, তবে একটি বৈশিষ্ট্য)) <goes_playing>বাহ, আমি যখন আপনার নামটি নিয়ে ঘোরাফেরা করি তখন আমি আপনার প্রতিনিধি দেখি! আমি সেটিকেও জানতাম না। @ প্রসূন: না, আপনি ঠিক বলেছেন, আমি পুনরাবৃত্তি করে এখন যেখানে এসেছি সেখানে পৌঁছেছি। (এই কারণেই আমি আপনার উত্তরটি বিটিডাব্লু -কে আপ-ভোট দিয়েছি))
এসবিআই

37

যেহেতু সি ++ 17, আপনি এখন স্থির সদস্য হিসাবে ঘোষণা করতে পারেন inline, যা শ্রেণীর সংজ্ঞায় পরিবর্তনশীল সংজ্ঞায়িত করবে:

template <typename T>
struct S
{
    ...
    static inline double something_relevant = 1.5;
};

লাইভ: https://godbolt.org/g/bgSw1u


1
এটি একটি দুর্দান্ত উত্তর। সংক্ষিপ্ত এবং সুনির্দিষ্ট আরও তথ্যের জন্য en.cppreferences.com/w/cpp/language/static#Static_data_meम्बर দেখুন ।
andreee

31

এটি কাজ করবে

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;

আমি something_relevant পরিবর্তনশীল সংজ্ঞায়িত করা হয়নি (আমি মুছে template<typename T> double S<T>::something_relevant=1.5;)? কম্পাইলার নিক্ষেপ error.Can আপনি দয়া করে আমাকে বলবেন কারণ কি
গুডম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.