2011-06-19 20 views
6

मैं इटरेटर और जेनेरिक फ़ंक्शंस पर बेहतर पकड़ पाने की कोशिश कर रहा हूं। मैंने सोचा कि यह एक ऐसा फ़ंक्शन लिखने के लिए उपयोगी अभ्यास होगा जो container1 < container2 <type> > को container3 <type> में परिवर्तित करता है। उदाहरण के लिए, यह vector< deque<int> > को list<int> में परिवर्तित करने में सक्षम होना चाहिए।कंटेनर के कंटेनर को फ़्लैट करने के लिए जेनेरिक फ़ंक्शन

मुझे लगा कि सभी कंटेनर एक्सेस इटरेटर के माध्यम से होनी चाहिए, जैसे <algorithm> में फ़ंक्शंस।

यहाँ मेरी कोड है:,

int main() 
{ 
    using namespace std; 

    vector< vector<string> > splitlines; 
    vector<string> flat; 

    /* some code to fill SPLITLINES with vectors of strings */ 

    flatten(splitlines.begin(), splitlines.end(), back_inserter(flat)); 
} 

मैं एक बड़ी सी ++ टेम्पलेट त्रुटि संदेश मिलता है undefined reference to void flatten< ... pages of templates ...

मैं:

#include <iterator> 
#include <algorithm> 

// COCiter == Container of Containers Iterator 
// Oiter == Output Iterator 
template <class COCiter, class Oiter> 
void flatten (COCiter start, COCiter end, Oiter dest) 
{ 
    using namespace std; 

    while (start != end) { 
     dest = copy(start->begin(), start()->end(), dest); 
     ++start; 
    } 
} 

लेकिन जब मैं निम्नलिखित कोड में इसे कहते हैं की कोशिश ऐसा लगता है कि मेरे कोड को लिखना बहुत आसान था, और मुझे यह सुनिश्चित करने के लिए कुछ और चीजों की आवश्यकता होगी कि आंतरिक कंटेनर में डेटा प्रकार आउटपुट कंटेनर में डेटा प्रकार से मेल खाता हो। लेकिन मुझे नहीं पता कि क्या करना है।

+0

ध्यान दें कि स्टैक में इटरेटर नहीं हैं, और कोई प्रारंभ/अंत कार्य नहीं है। यदि आप इसे ढेर के साथ काम करना चाहते हैं, तो आपको निश्चित रूप से विशेष मामले में जाना होगा। –

+0

यह सच है; मैं सवाल बदल दूंगा। मुझे वास्तव में ढेर compatibiliy की जरूरत नहीं है; बस पुनरावर्तनीय कंटेनर। – japreiss

उत्तर

8

मुझे समस्या मिली। SFINAE के लिए धन्यवाद (प्रतिस्थापन विफलता कोई त्रुटि नहीं है) आपके कंपाइलर को सही टेम्पलेट नहीं मिला क्योंकि आप (शायद एक टाइपो) टाइप करके पर operator() पर कॉल करने का प्रयास कर रहे हैं। इसे आज़माएं:

#include <iterator> 
#include <algorithm> 

// COCiter == Container of Containers Iterator 
// Oiter == Output Iterator 
template <class COCiter, class Oiter> 
void flatten (COCiter start, COCiter end, Oiter dest) { 
    while (start != end) { 
     dest = std::copy(start->begin(), start->end(), dest); 
     ++start; 
    } 
} 
+0

एसएफआईएनएई प्रतिस्थापन विफलताओं के लिए काम नहीं करता है जो समारोह के शरीर में होता है। यह केवल फ़ंक्शन हस्ताक्षर (रिटर्न प्रकार और पैरामीटर) में काम करता है। –

+0

हालांकि, आपका फिक्स काम करता है :) –

+0

यह वास्तव में एक टाइपो था, लेकिन यह पता चला कि मैं एक हेडर फ़ाइल में अपने जेनेरिक फ़ंक्शन प्रोटोटाइप को शामिल करने की त्रुटि भी बना रहा था। मैंने अभी पाया कि आप ऐसा नहीं कर सकते; आपको पूरी सीपीपी फ़ाइल (मुझे लगता है) शामिल करना होगा। – japreiss

संबंधित मुद्दे