আমার বোধগম্যতা হল যে সি ++ স্ট্যাটিক কনস্ট সদস্যদের কোনও শ্রেণীর অভ্যন্তরে সংজ্ঞায়িত করার অনুমতি দেয় যতক্ষণ না এটি একটি পূর্ণসংখ্যার প্রকার।
তাহলে, কেন নীচের কোডটি আমাকে একটি লিঙ্কারের ত্রুটি দেয়?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
আমি যে ত্রুটি পেয়েছি তা হ'ল:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
মজার বিষয় হল, আমি যদি কলকে স্ট্যান্ড :: মিনিটে মন্তব্য করি তবে কোডটি সংকলন এবং লিঙ্কগুলি ঠিক জরিমানা (যদিও পরীক্ষা :: এনও পূর্ববর্তী লাইনে রেফারেন্সযুক্ত)।
কি হচ্ছে সম্পর্কে কোন ধারণা?
আমার সংকলকটি লিনাক্সে জিসিসি 4.4।
char
, আপনি এটির পরিবর্তে এটি সংজ্ঞায়িত করতে পারেন constexpr static const char &N = "n"[0];
। নোট করুন &
। আমার ধারণা এটি কাজ করে কারণ আক্ষরিক স্ট্রিংগুলি স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয়। আমি যদিও এ সম্পর্কে উদ্বিগ্ন - এটি বিভিন্ন অনুবাদ ইউনিটের মধ্যে শিরোনামের ফাইলে অদ্ভুত আচরণ করতে পারে কারণ স্ট্রিংটি সম্ভবত একাধিক ভিন্ন ঠিকানায় থাকবে।
inline const int N = 10
, যা আমার জ্ঞানের কাছে এখনও লিঙ্কার দ্বারা নির্ধারিত কোথাও স্টোরেজ রয়েছে। শ্রেণি সংজ্ঞা পরীক্ষার অভ্যন্তরে স্থির পরিবর্তনশীল সংজ্ঞা প্রদান করতে কী-ওয়ার্ড ইনলাইনও এই ক্ষেত্রে ব্যবহৃত হতে পারে ।