यह काम करता है:टेम्पलेट क्लास के नेस्टेड क्लास में किसी मित्र ऑपरेटर की परिभाषा कैसे प्रदान करें?
template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b)
{
return a.t < b.t;
}
} d;
};
यह काम नहीं करता:
1>ConsoleApplication1.obj : error LNK2019: unresolved external symbol "bool __cdecl operator<(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)" ([email protected][email protected][email protected]@@[email protected]) referenced in function "public: bool __thiscall std::less<struct Bob<int>::Dave>::operator()(struct Bob<int>::Dave const &,struct Bob<int>::Dave const &)const " ([email protected]@[email protected]@@@[email protected]@[email protected][email protected]@@[email protected])
:
template<class Tim>
struct Bob
{
struct Dave
{
Tim t{};
friend bool operator < (const Dave& a, const Dave& b);
} d;
};
template<class Tim>
bool operator < (const typename Bob<Tim>::Dave& a, const typename Bob<Tim>::Dave& b)
{
return a.t < b.t;
}
जब मैं उदाहरण के लिए एक नक्शे में इसका इस्तेमाल करने की कोशिश, मैं लिंकर त्रुटियों मिलता है।
int main()
{
std::map<Bob<int>::Dave, int> v;
v[{}];
}
कैसे मैं सही ढंग से बाहर वर्ग इस ऑपरेटर परिभाषित कर सकते हैं?
यदि आप चेतावनियां चालू करते हैं, तो आपको मिलता है: 'चेतावनी: मित्र घोषणा' बूल ऑपरेटर <(कॉन्स बॉब :: डेव और, कॉन्स बॉब :: डेव और) 'एक गैर-टेम्पलेट फ़ंक्शन घोषित करता है' (और एक संकेत इसके बारे में करें) - तो मित्र 'ऑपरेटर <' आप घोषित करते हैं, और 'टेम्पलेट <...> ऑपरेटर <' आप आगे परिभाषित करते हैं, वही बात नहीं है। –
melak47
@ melak47 वीएस2015 चेतावनी स्तर 4, मुझे कोई चेतावनी नहीं मिली है। –
क्षमा करें, जीसीसी के आउटपुट देखें: http://coliru.stacked-crooked.com/a/bb58214d285f031f – melak47