to_string std का सदस्य नहीं है, g ++ (mingw) का कहना है


245

मैं एक छोटी शब्दावली को याद रखने वाला कार्यक्रम बना रहा हूं, जहां शब्द मेरे लिए बेतरतीब ढंग से फ्लैश किए जाएंगे। मैं मानक C ++ लाइब्रेरी का उपयोग करना चाहता हूं क्योंकि Bjarne Stroustroup हमें बताता है, लेकिन मुझे गेट के ठीक बाहर एक अजीब सी समस्या का सामना करना पड़ा है।

मैं एक longपूर्णांक को बदलना चाहता हूं std::stringताकि इसे एक फ़ाइल में संग्रहीत करने में सक्षम हो। मैंने to_string()उसी के लिए काम किया है। समस्या यह है, जब मैं इसे g ++ (संस्करण 4.7.0 (इसके -version ध्वज के रूप में उल्लिखित) के साथ संकलित करता हूं, तो यह कहता है:

PS C:\Users\Anurag\SkyDrive\College\Programs> g++ -std=c++0x ttd.cpp
ttd.cpp: In function 'int main()':
ttd.cpp:11:2: error: 'to_string' is not a member of 'std'

मेरा प्रोग्राम जो यह त्रुटि देता है:

#include <string>

int main()
{
    std::to_string(0);
    return 0;
}

लेकिन, मुझे पता है कि यह नहीं हो सकता क्योंकि एमएसडीएन पुस्तकालय स्पष्ट रूप से कहता है कि यह मौजूद है और स्टैक ओवरफ्लो पर एक पुराना सवाल (जी ++ संस्करण 4.5 के लिए) कहता है कि इसे -std=c++0xध्वज के साथ चालू किया जा सकता है । मैं क्या गलत कर रहा हूं?


5
मेरे जीसीसी 4.4.5 के साथ काम करता है (यानी, "अस्पष्ट अधिभार" त्रुटि देता है); शायद तुम्हारा libstdc++पुराना है?
फ्रेड फू

3
यह Ideone पर काम करता है , जो GCC 4.5.1 का उपयोग करता है।
केरेक एसबी

5
यह मेरे लिए g ++ 4.6.3 के साथ काम करता है। आपकी त्रुटि लाइन 11 को संदर्भित करती है। आप कहते हैं कि आपका प्रोग्राम "अनिवार्य रूप से आपके कोड को कम कर दिया गया है", लेकिन क्या आपके द्वारा पोस्ट किया गया कोड भी वह त्रुटि देता है?
वॉन काटो

@VaughnCato - हां यह सटीक कार्यक्रम है। मुझे इसे स्पष्ट करने के लिए संपादित करना चाहिए। इसके अलावा, उस आवारा int मैं वहाँ क्या कर रहा हूँ?
अनुराग कालिया

2
यह भी मेरे लिए काम नहीं करता है, भले ही मैं जीसीसी 5.3.1 का उपयोग कर रहा हूं। हालाँकि, जो इसे ठीक करता है वह बाद में C ++ मानक का उपयोग करता है - अर्थात ध्वज -std=c++11या उच्चतर के साथ संकलित करके ।
आर्टुरो डॉन जुआन

जवाबों:


212

यह MinGW के तहत एक ज्ञात बग है। प्रासंगिक बुगज़िला । टिप्पणी अनुभाग में आप इसे मिनगॉव के साथ काम करने के लिए एक पैच प्राप्त कर सकते हैं ।

यह मुद्दा MinGW-w64 डिस्ट्रोस में तय किया गया है जो कि GG 4.8.0 की तुलना में MinGW-w64 प्रोजेक्ट द्वारा प्रदान किया गया है । नाम के बावजूद, परियोजना 64-बिट के साथ 32-बिट के लिए टूलचिन प्रदान करती है। Nuwen MinGW distro भी इस मुद्दे को हल करती है।


2
यहाँ आगे चर्चा: stackoverflow.com/questions/8542221/…
Ben

11
मैं MinGW-w64 संस्करण 4.8.1 का उपयोग कर रहा हूं और यह काम नहीं कर रहा है। मैंने प्रश्न से सटीक कार्यक्रम की प्रतिलिपि बनाई। मुझे अभी भी 'to_string' 'std' त्रुटि का सदस्य नहीं है। मैंने इसे इस प्रकार संकलित किया है: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664

5
@ zam664 मैं समझा नहीं सकता कि क्यों, लेकिन मुझे std::to_stringMinGW 4.8.1 (विशेषकर x32-4.8.1-posix-dwarf-rev5) , MinGW-buildds के माध्यम से स्थापित करके काम करना पड़ा । इसके विपरीत, "mingw-get" इंस्टॉलर या TDM-GCC पैकेज के माध्यम से स्थापित किए गए MinGW 4.8.1 के साथ काम नहींto_string किया ।
सेरन

5
पैच मेरे लिए काफी नहीं था, मैं ही था #define _GLIBCXX_USE_C99 1में C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hके रूप में वर्णित यहाँ
Zook

3
@Cerran "MinGW-buildds", MinGW-w64 का निर्माण है, जो MinGW के लिए एक अलग परियोजना है। एक कारण यह है कि MinGW-w64 को बंद कर दिया गया था ताकि वे वास्तव में बग को ठीक कर सकें जैसे कि यह धागा था।
MM

116
#include <string>
#include <sstream>

namespace patch
{
    template < typename T > std::string to_string( const T& n )
    {
        std::ostringstream stm ;
        stm << n ;
        return stm.str() ;
    }
}

#include <iostream>

int main()
{
    std::cout << patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ;
}

शामिल करना न भूलें #include <sstream>


क्या स्टोड को भी शामिल करने का कोई तरीका है?
जैकी

मैं आपके फ़ंक्शन को किसी अन्य स्रोत फ़ाइल से कॉल करता हूं: पैच :: to_string (errorCode) (जहां त्रुटिकोड int है) और कंपाइलर मुझे उस लाइन पर एक त्रुटि देता है। त्रुटि है: अपरिभाषित संदर्भ `std :: string पैच :: to_string <int> (int &) 'हालांकि जब भी मैं एक ही स्रोत फ़ाइल संकलक में अपने कोड को शामिल नहीं करता शिकायत नहीं करता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या गलत है।
निकोस

1
कृपया ध्यान दें कि अनुगामी शून्य के संबंध में यह एक सटीक समाधान नहीं है। मूल std::to_string(0.75)आम तौर पर वापस आ जाएगा "0.750000"(डिफ़ॉल्ट स्प्रिंटफ% d प्रारूप) जबकि यह वापस आ जाएगा "0.75"। यहां देखें कारण: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

47

जैसा कि सुझाया गया है कि यह आपके संकलक संस्करण के साथ एक समस्या हो सकती है।

एक कन्वर्ट करने के लिए निम्नलिखित कोड का उपयोग कर प्रयास करें longकरने के लिए std::string:

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}

मैंने इसे नहीं चलाया है लेकिन मेरी तत्काल दुविधा को हल करने के लिए धन्यवाद। अब मुझे केवल यह पता लगाना है कि यह कैसे काम करता है। :)
अनुराग कालिया

बस एक ध्यान दें कि यदि आप एक चाहते हैं std::string, तो आप .str()इसके बजाय उपयोग करना चाहते हैं ।
क्रिश्चियन मैन

1
कृपया ध्यान दें कि अनुगामी शून्य के संबंध में यह एक सटीक समाधान नहीं है। मूल std::to_string(0.75)आम तौर पर वापस आ जाएगा "0.750000"(डिफ़ॉल्ट स्प्रिंटफ% d प्रारूप) जबकि यह वापस आ जाएगा "0.75"। यहां देखें कारण: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

20

इस फ़ंक्शन का उपयोग करें ...

    #include<sstream>
    template <typename T>
    std::string to_string(T value)
    {
      //create an output string stream
      std::ostringstream os ;

      //throw the value into the string stream
      os << value ;

      //convert the string stream into a string and return
      return os.str() ;
    }

    //you can also do this
    //std::string output;
    //os >> output;  //throw whats in the string stream into the string

2
कृपया, अपने उत्तरों में कुछ स्पष्टीकरण (कम से कम टिप्पणी) जोड़ें, चाहे कोड कितना भी आसान क्यों न हो।
vefthym

4
वर्कअराउंड करना अच्छा है, लेकिन मुझे लगता है कि इसका आम तौर पर यह पता लगाना सबसे अच्छा है कि एसटीडी समाधान एक साथ हैक करने के बजाय किसी चीज को क्यों नहीं संकलित किया जाता है
मैट कॉयूब्रॉट

"मानक" तरीका (std :: to_string) अक्सर काम करता है - सिवाय इसके कि कब नहीं। स्ट्रेच "मानक" वर्कअराउंड है।
निक वेन्स

कृपया ध्यान दें कि अनुगामी शून्य के संबंध में यह एक सटीक समाधान नहीं है। मूल std::to_string(0.75)आम तौर पर वापस आ जाएगा "0.750000"(डिफ़ॉल्ट स्प्रिंटफ% d प्रारूप) जबकि यह वापस आ जाएगा "0.75"। यहां देखें कारण: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

12

to_string Cygwin के साथ एक वर्तमान मुद्दा है

यहां एक पुराने धागे का नया-ईश उत्तर दिया गया है। एक नया आया, लेकिन जल्दी से समाप्त हो गया था, Cygwin: g ++ 5.2: 'to_string' 'std' का सदस्य नहीं है

बहुत बुरा, शायद हम एक अद्यतन जवाब मिल गया होता। @ एलेक्स के अनुसार, साइगविन जी ++ 5.2 अभी भी 3 नवंबर 2015 तक काम नहीं कर रहा है।

16 जनवरी, 2015 को कोरिना विंसचेन, रेड हैट में एक साइगविन अनुरक्षक ने कहा कि समस्या newlib की कमी थी। यह सबसे लंबे दोहरे कार्यों का समर्थन नहीं करता है और इसलिए C99 के बारे में पता नहीं है।

रेड हैट है,

... अभी भी एक बिंदु पर newlib में "लंबी डबल" कार्यक्षमता प्राप्त करने की उम्मीद है।

25 अक्टूबर, 2015 को कोरीन ने भी कहा ,

यह अभी भी अच्छा होगा अगर कोई गणित ज्ञान वाला कोई व्यक्ति गुमशुदा लंबे दोहरे कार्यों को नया बनाने में योगदान देगा।

ये लो हमें मिल गया। हो सकता है कि हममें से कोई जिसके पास ज्ञान हो, और समय हो, योगदान दे सकता है और नायक हो सकता है।

न्यूलिब यहाँ है


यह देखकर कि वे इस साल केवल मेल के माध्यम से पैच भेजने से कैसे पलायन कर गए, यह हतोत्साहित करता है ...
rr-

8

डिफ़ॉल्ट C ++ मानक बदलें

से (COMPILE FILE FAILED) त्रुटि: 'to_string' 'std' का सदस्य नहीं है

-std = c ++ 98

के लिए (फ़ाइल को संकलित करें)

-std = c ++ 11 या -std = c ++ 14

Cygwin G ++ (GCC) 5.4.0 पर परीक्षण किया गया


3

to_string () c ++ में ही मौजूद है 11 c ++ संस्करण कम जैसे कुछ वैकल्पिक तरीकों का उपयोग है, इसलिए यदि sprintf या ostringstream


2

तथ्य यह है कि libstdc ++ वास्तव std::to_stringमें 4.8.0 के बाद से * -w64-mingw32 लक्ष्य में समर्थित है । हालाँकि, इसमें MinGW.org, Cygwin और वेरिएंट (जैसे * MSYS2 से * -pc-msys) का समर्थन शामिल नहीं है। Https://cygwin.com/ml/cygwin/2015-01/msg00245.html भी देखें

मैंने MinGW-w64 के लिए हल किए गए बग से पहले वर्कअराउंड लागू किया है। अन्य उत्तरों में कोड के लिए भिन्न होने के नाते, यह libstdc ++ (जितना संभव हो) की नकल है। इसके लिए स्ट्रिंग स्ट्रीम निर्माण की आवश्यकता नहीं है लेकिन यह libstdc ++ एक्सटेंशन पर निर्भर करता है। अब भी मैं विंडोज पर mingw-w64 लक्ष्यों का उपयोग कर रहा हूं, यह अभी भी कई अन्य लक्ष्यों के लिए अच्छी तरह से काम करता है (जब तक कि long doubleकार्यों का उपयोग नहीं किया जा रहा है)।


2

किसी के लिए भी यह सोचना कि Android पर ऐसा क्यों होता है, यह शायद इसलिए है क्योंकि आप गलत c ++ मानक लाइब्रेरी का उपयोग कर रहे हैं। से अपने build.gradle में c ++ पुस्तकालय बदलने का प्रयास करें gnustl_staticकरने के लिए c++_staticऔर c ++ मानक अपने CMakeLists.txt में से -std=gnu++11करने के लिए-std=c++11


1

यदि हम निम्नलिखित की तरह टेम्प्लेट-लाइट-सॉल्यूशन का उपयोग करते हैं (जैसा कि ऊपर दिखाया गया है):

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

दुर्भाग्य से, हमें कुछ मामलों में समस्या होगी। उदाहरण के लिए, स्थिर कॉन्स्टेबल सदस्यों के लिए:

HPP

class A
{
public:

    static const std::size_t x = 10;

    A();
};

सीपीपी

A::A()
{
    std::cout << std::to_string(x);
}

और लिंकिंग:

CMakeFiles/untitled2.dir/a.cpp.o:a.cpp:(.rdata$.refptr._ZN1A1xE[.refptr._ZN1A1xE]+0x0): undefined reference to `A::x'
collect2: error: ld returned 1 exit status

यहाँ समस्या को हल करने का एक तरीका है (type size_t में जोड़ें ):

namespace std {
    std::string to_string(size_t n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

HTH।


0

कोडब्लॉक में सेटिंग -> कंपाइलर सेटिंग -> कंपाइलर फ्लैग -> एसटीडी c ++ 11 किया। मुझे भी यही समस्या थी ... अब यह काम कर रहा है!


-4

यह मेरे साथ भी हुआ, मैंने सिर्फ अपने कंपाइलर को अपडेट करने की चिंता करने के बजाय एक त्वरित कार्य लिखा।

string to_string(int number){
    string number_string = "";
    char ones_char;
    int ones = 0;
    while(true){
        ones = number % 10;
        switch(ones){
            case 0: ones_char = '0'; break;
            case 1: ones_char = '1'; break;
            case 2: ones_char = '2'; break;
            case 3: ones_char = '3'; break;
            case 4: ones_char = '4'; break;
            case 5: ones_char = '5'; break;
            case 6: ones_char = '6'; break;
            case 7: ones_char = '7'; break;
            case 8: ones_char = '8'; break;
            case 9: ones_char = '9'; break;
            default : ErrorHandling("Trouble converting number to string.");
        }
        number -= ones;
        number_string = ones_char + number_string;
        if(number == 0){
            break;
        }
        number = number/10;
    }
    return number_string;
}

29
यह std :: to_string का विकल्प नहीं है और निश्चित रूप से प्रश्न का उत्तर नहीं है।
वेरैक्स

13
एसटीडी लागू करने के लिए मत भूलना :: cout भी! मूल मुद्दे का पता लगाने की तुलना में बहुत सारे अतिरिक्त कीड़े के साथ फिर से लागू करने के लिए बेहतर है!
jmc

आप चीजों को ओवरकमप्लेक्स बना रहे हैं। बसones_char = '0' + number % 10;
फुल्वक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.