2012-04-19 10 views
5
void PrintNow(const std::vector<int> &v) 
{ 
    std::cout << v[0] << std::endl; 
} 

std::vector<int>().push_back(20); // this line generates no complains 
PrintNow(std::vector<int>().push_back(20)); // error 

VS2010 SP1 से:क्या हम अस्थायी पास-इन 'std :: वेक्टर <int> `पैरामीटर बना सकते हैं?

eror C2664: 'PrintNow': 'शून्य' से पैरामीटर 1 परिवर्तित नहीं कर सकते करने के लिए 'स्थिरांक std :: वेक्टर < _Ty> &'

क्यू > क्या यह संभव है कि हम कार्य करने के लिए अस्थायी वेक्टर पास कर सकें?

उत्तर

8

सी ++ 11 में आप सिर्फ कर सकते हैं:: डी ऊपर std::vector वर्ग के उपलब्ध कंस्ट्रक्टर्स में से एक का उपयोग करता है

void PrintNow(const std::vector<int> &v) 
{ 
    std::cout << v[0] << std::endl; 
} 

PrintNow({20}); 

VS2010 अभी तक के इस हिस्से का समर्थन नहीं करता सी ++ 11 यद्यपि । (जीसीसी 4.4 और बजना 3.1 करते हैं)

आप केवल सी ++ 03 में एक भी तत्व तो आप कर सकते हैं की जरूरत है:

PrintNow(std::vector<int>(1,20)); 

आप एक से अधिक तत्व की जरूरत है तो मैं वहाँ नहीं लगता कि अगर कोई भी लाइन समाधान। आप यह कर सकते हैं:

{ // introduce scope to limit array lifetime 
    int arr[] = {20,1,2,3}; 
    PrintNow(std::vector<int>(arr,arr+sizeof(arr)/sizeof(*arr)); 
} 

या आप एक varargs फ़ंक्शन लिख सकते हैं जो स्याही की सूची लेता है और वेक्टर लौटाता है। जब तक आप इसका बहुत उपयोग नहीं करते हैं, हालांकि मुझे नहीं पता कि यह इसके लायक है।

+0

' {20} 'वाक्यविन्यास कम से कम जीसीसी 4.4.5 में समर्थित है। –

+0

सी ++ 03 में, आप एक के लिए ['boost :: list_of'] (http://www.boost.org/doc/libs/1_39_0/libs/assign/doc/index.html#list_of) का उपयोग कर सकते हैं कोई अतिरिक्त नामित चर के साथ -लाइन समाधान। –

4

समस्या यह है कि std::vector::push_back()void देता है, न कि आप फ़ंक्शन में अस्थायी रूप से पास नहीं कर सकते हैं।

+0

'शून्य वेक्टर :: push_back (कॉन्स टी एंड एक्स)' – q0987

+2

@ q0987 बिल्कुल ... इसलिए यह 'शून्य 'देता है ... –

3

सभी तत्वों को एक ही मूल्य के हैं, तो आप एक निर्माता आपकी आवश्यकताएं पूरी राशि:

PrintNow(std::vector<int>(1,20)); 
4

त्रुटि उत्पन्न होता है क्योंकि std::vector::push_back समारोह की वापसी प्रकार void है:

void push_back (const T& x); 

निम्न का प्रयास करें:

PrintNow(std::vector<int>(1, 20)); 

सह

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 
संबंधित मुद्दे