मैं एक वेक्टर लाइब्रेरी तैयार कर रहा हूं और एक स्नैग मारा है। मैं रिकर्सिव वैक्टर (यानी vec<H,vec<W,T> >
) को अनुमति देना चाहता हूं, इसलिए मैं अपने "मिनट" और अन्य कार्यों को भी रिकर्सिव करना चाहता हूं। यहां मेरे पास है:सी ++ को एक गैर-बदसूरत तरीके से सही टेम्पलेट विधि को कॉल करें
template<typename T>
inline T min(const T& k1, const T& k2) {
return k1 < k2 ? k1 : k2;
}
template<int N, typename T, typename VT1, typename VT2>
inline vec<N,T> min(const container<N,T,VT1>& v1, const container<N,T,VT2>& v2) {
vec<N,T> new_vec;
for (int i = 0; i < N; i++) new_vec[i] = min(v1[i], v2[i]);
return new_vec;
}
...
template<int N, typename T>
class vec : public container<N,T,vec_array<N,T> > {
...
// This calls the first (wrong) method and says you can't call ? on a vec
vec<2,float> v1,v2;
min(v1,v2);
// This says the call is ambiguous
container<2,float,vec_array<2,float> > c1,c2;
min(c1,c2);
// This one actually works
vec<2,float> v3; container<N,T,some_other_type> v4;
min(v3,v4);
// This works too
min<2,float,vec_array<2,float>,vec_array<2,float> >(v1, v2);
वह अंतिम कॉल बदसूरत है! मैं सिर्फ min(v1,v2)
के साथ सही विधि कैसे कॉल कर सकता हूं? सबसे अच्छा मैं "वीसी" वर्ग से छुटकारा पाने के लिए आ सकता हूं (इसलिए v1 और v2 को कंटेनर < 2, फ्लोट, vec_array < 2, फ्लोट>>) के रूप में परिभाषित किया जाना चाहिए और एक और template<N,T,VT>
मिनट विधि को कॉल करें min<N,T,VT,VT>(v1,v2)
।
धन्यवाद!
'कंटेनर' टेम्पलेट कैसा दिखता है? – Chubsdad
कंटेनर वास्तव में सरल है। इसमें एक सदस्य है, "वीटी _vec", और एक [] ऑपरेटर को परिभाषित करता है जो सिर्फ _vec [i] को कॉल करता है। – Chris
अपने फ़ंक्शन 'मिनट' के लिए एक अलग नाम का उपयोग करने का प्रयास करें उदा। 'Mymin'। मुझे लगता है कि std :: min के साथ ओवरलोड रिज़ॉल्यूशन आपको दुःस्वप्न दे रहा है – Chubsdad