C ++ C ++ 20 standardına kadar, bir şablon sınıfının bazı özel üyelerini kullanan sınıf dışı bir operatör tanımlamak istediğimizde, buna benzer bir yapı kullanırdık:
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;
}
Bununla birlikte, C ++ 20'den beri, sınıf dışı bildirimi, dolayısıyla ileri bildirimi atlayabiliriz, böylece sadece:
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;
}
Şimdi sorum şu: C ++ 20'nin hangi kısmı bunu yapmamıza izin veriyor? Ve bu daha önceki C ++ standartlarında neden mümkün olmadı?
Yorumlarda belirtildiği gibi, clang demoda sunulan bu kodu kabul etmiyor, bu aslında gcc'de bir hata olabileceğini düşündürüyor.
Gcc'nin bugzilla'sına bir hata raporu verdim
"c string" == Foo<std::string>("foo")
)).