সি ++ এর 20 + স্ট্যান্ডার্ড অবধি, যখন আমরা কোনও ক্লাসের বাইরে থাকা অপারেটরটিকে সংজ্ঞায়িত করতে চেয়েছিলাম যা কোনও টেম্পলেট শ্রেণির কিছু ব্যক্তিগত সদস্য ব্যবহার করে, আমরা এর অনুরূপ একটি নির্মাণ ব্যবহার করব:
template <typename T>
class Foo;
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs);
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
int main() {
return 1 == Foo<int>(1) ? 0 : 1;
}
যেহেতু সি ++ ২০, তবে আমরা ক্লাসের বাইরে থাকা ঘোষণাটি বাদ দিতে পারি, এইভাবে এগিয়ে ঘোষণাও যাতে আমরা ন্যায়সঙ্গতভাবে পালাতে পারি:
template <typename T>
class Foo {
public:
constexpr Foo(T k) : mK(k) {}
constexpr friend bool operator==<T>(T lhs, const Foo& rhs);
private:
T mK;
};
template <typename T>
constexpr bool operator==(T lhs, const Foo<T>& rhs) {
return lhs == rhs.mK;
}
এখন, আমার প্রশ্নটি হল, সি ++ এর কোন অংশটি আমাদের এটি করতে দেয়? এবং কেন আগে সি ++ স্ট্যান্ডার্ডে এটি সম্ভব ছিল না?
মন্তব্যে যেমন উল্লেখ করা হয়েছিল, ঝনক ডেমোতে উপস্থাপিত এই কোডটি গ্রহণ করে না, যা প্রস্তাব দেয় এটি প্রকৃতপক্ষে জিসিসিতে কোনও বাগ হতে পারে।
আমি জিসিসির বাগজিলায় একটি বাগ রিপোর্ট দায়ের করেছি
"c string" == Foo<std::string>("foo")
) এড়িয়ে ।