के साथ अस्वीकार करता है मैं सी ++ में फ़ैक्टर के साथ खेल रहा हूं। विशेष रूप से, मुझे जोड़ों का एक वेक्टर मिला है जो मैं जोड़ी के पहले तत्व द्वारा क्रमबद्ध करना चाहता हूं। मैंने एक पूरी तरह से विशेष मज़ेदार लिखना शुरू कर दिया (यानी कुछ "जैसे बूल माईलेशन (माईपैयर & एलएचएस, माईपैयर & आरएएस)")। फिर, सिर्फ इसलिए कि इस तरह की चीजें दिलचस्प है, मैं एक सामान्य "इस जोड़ी के पहले तत्वों में एफ लागू करें" मज़ेदार लिखने की कोशिश करना चाहता था। मैंने नीचे लिखा है, लेकिन जी ++ इसे पसंद नहीं करता है। मैं:जी ++ मेरे साधारण मज़ेदार को "अपेक्षित एक प्रकार, मिला 'xyz'"
त्रुटि: 'टेम्पलेट struct Pair1stFunc2' त्रुटि के लिए टेम्पलेट पैरामीटर सूची में तर्क 2 में टाइप/मूल्य बेमेल: एक प्रकार की उम्मीद, 'कम'
#include <algorithm>
#include <functional>
#include <utility>
#include <vector>
template <class P, class F>
struct Pair1stFunc2
{
typename F::result_type operator()(P &lhs, P &rhs) const
{ return F(lhs.first, rhs.first); }
typename F::result_type operator()(const P &lhs, const P &rhs) const
{ return F(lhs.first, rhs.first); }
};
typedef std::pair<int,int> MyPair;
typedef std::vector<MyPair> MyPairList;
MyPairList pairs;
void foo(void)
{
std::sort(pairs.begin(),
pairs.end(),
Pair1stFunc2<MyPair, std::less>());
}
किसी को भी किसी भी प्रकाश पर डाला जा सकता है मिल गया मैं यहाँ क्या गलत कर रहा हूँ? मुझे पता है कि यह थोड़ा कृत्रिम उदाहरण है, लेकिन मैं जानना चाहता हूं कि क्या हो रहा है, अगर केवल मेरे एसटीएल-फू को बेहतर बनाने के लिए।
एक बार जब आप इस समस्या को हल कर लेंगे, तो आपके पास दूसरा होगा क्योंकि एफ एक प्रकार है। आप lhs.first और rhs.first का उपयोग कर एक नया एफ बना रहे हैं। आप पाएंगे कि std :: कम में दो-तर्क कन्स्ट्रक्टर नहीं है। आपको एफ * –
प्रकार का * वैल्यू * होना चाहिए, यहां कुछ बढ़ावा देने के लिए कुछ है :: bind-fu: sort (p.begin(), p.end(), बाइंड (कम(), बाइंड (और माईपैयर: : पहला, _1), बांधें (और MyPair :: पहला, _2))); ;) http://codepad.org/NouR5fko –