2011-08-15 14 views
9

मैं इस नक्शे को जो MSVC10 में ठीक संकलित है:क्या std :: ofstream movable है?

std::map<std::string, std::ofstream> m_logFiles; 

लेकिन ubuntu पर का उपयोग कर जी ++ 4.5 के साथ C++ 0x सक्षम हो, तो मैं निम्न त्रुटि संदेश मिलता है:

/usr/शामिल/C++/4.5/बिट्स/ios_base.h | 785 | त्रुटि: 'std :: ios_base :: ios_base (स्थिरांक std :: & ios_base)' निजी

वस्तुओं के बजाय संकेत का उपयोग करके है, मैं समस्या हल हो गई।
वेब पर खोज, मैंने सीखा कि धाराओं की प्रतिलिपि बनाने के लिए नहीं हैं (क्यों अच्छी तरह से समझाया गया था)। लेकिन मेरा सवाल है, std :: एक चलने योग्य प्रकार की धारा है? यदि ऐसा है, तो क्या इसे मानक कंटेनर में टेम्पलेट पैरामीटर के रूप में उपयोग करने की अनुमति नहीं देनी चाहिए?
यदि हां, तो इस बिंदु पर MSVC10 के पीछे g ++ है? (जो समझाएगा कि यह एमएसवीसी पर क्यों काम करता है)। मुझे पता है कि कंपाइलर लेखकों से कुछ भी पूरी तरह लागू करने के लिए यह मूर्खतापूर्ण होगा जो कि अंतिम भी नहीं है, लेकिन मैं भविष्य के बारे में उत्सुक हूं।

जी ++ 4.6.1 का उपयोग करने में मदद नहीं मिली।

संपादित करें: टिप्पणियों को पढ़ने के लिए मैंने थोड़ा और खोला और पाया कि डालने से समस्या का कारण बन रहा है, मानचित्र की घोषणा नहीं।

#include <string> 
#include <fstream> 
#include <map> 

using namespace std; 

int main() 
{ 
    map<string, ofstream> m_logFiles; 
    ofstream st; 
    m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st))); 
    return 0; 
} 

लेकिन फिर भी प्रयास विफल:

पढ़ना Cubbi के लिंक मैं निम्नलिखित की कोशिश की। जी ++ बी हटाए गए प्रतिलिपि निर्माता के उपयोग के बारे में शिकायत करता है।

+0

जीसीसी 4.6.1 में ठीक संकलित करता है। –

+0

पोस्ट कोड जीसीसी 4.5.3 में ठीक से संकलित करता है। हालांकि, जीसीसी के पुस्तकालय (बजना के libC++ के विपरीत) अभी तक लागू नहीं किया गया है map.emplace() http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436 - शायद कि क्या त्रुटि संदेश के कारण होता है? – Cubbi

+0

@ कब्बी: मैंने आपका लिंक पढ़ा और std :: move का उपयोग करने का प्रयास किया, लेकिन कोई बदलाव नहीं हुआ। –

उत्तर

8

std::ofstream चल रहा है। इस कार्यक्रम के लिए मुझे बजना का उपयोग कर/libC++ के लिए संकलित:

#include <string> 
#include <fstream> 
#include <map> 

int main() 
{ 
    std::map<std::string, std::ofstream> m_logFiles; 
} 

संदर्भ 27.9.1.11 [ofstream.cons]।

+5

किसी एक संकलक (या यहां तक ​​कि कई कंपाइलर) पर परिणाम वास्तव में इस प्रश्न का उत्तर नहीं देता है। Spec के लिए एक संदर्भ की आवश्यकता है। – Nemo

+5

@ नीमो - हावर्ड इस कंपाइलर के लिए मानक लाइब्रेरी को लागू करने वाला व्यक्ति है। मैं उसे भरोसा करता हूं। –

+1

सी ++ 0 एक्स ड्राफ्ट के सभी अनुभाग 27 की बहुत अधिक जांच करें। मुझे एक भी जगह नहीं मिली जो कहती है "ऑफस्ट्रीम चलने योग्य" होगा, लेकिन यह निर्दिष्ट करता है कि धारा वर्गों ने रचनाकारों को स्थानांतरित किया है और असाइनमेंट ऑपरेटरों और अन्य सभी चाल-संबंधित नलसाजी को स्थानांतरित किया है। तो हाँ, वे चल रहे हैं, जैसे @ हावर्ड ने कहा। :) – jalf

5

मैंने पहले इसी तरह के प्रश्न पूछा, और बाद में पाया कि जीसीसी अभी तक चलने योग्य fstreams का समर्थन नहीं कर रहा है (मैंने अभी जीसीसी 4.6.1 का परीक्षण किया है) जैसा कि this answer में विस्तृत है।

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