to_string ไม่ได้เป็นสมาชิกของ std กล่าวว่า g ++ (mingw)


245

ฉันกำลังทำโปรแกรมจดจำคำศัพท์ขนาดเล็กซึ่งคำต่างๆจะถูกกระพริบที่ฉันแบบสุ่มสำหรับความหมาย ฉันต้องการใช้ไลบรารี C ++ มาตรฐานเนื่องจาก Bjarne Stroustroup บอกเรา แต่ฉันพบปัญหาแปลก ๆ ที่ดูเหมือนจะเกิดขึ้นนอกประตู

ฉันต้องการเปลี่ยนlongจำนวนเต็มstd::stringเพื่อให้สามารถเก็บไว้ในไฟล์ได้ ฉันมีงานทำto_string()เหมือนกัน ปัญหาคือเมื่อฉันรวบรวมมันด้วย g ++ (รุ่น 4.7.0 ตามที่ระบุไว้ใน --‍version flag) มันพูดว่า:

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;
}

แต่ฉันรู้ว่ามันเป็นไปไม่ได้เพราะไลบรารี่ msdn บอกว่ามันมีอยู่จริงและคำถามก่อนหน้านี้เกี่ยวกับ Stack Overflow (สำหรับ g ++ เวอร์ชัน 4.5) บอกว่ามันสามารถเปิดได้ด้วย-std=c++0xแฟล็ก ผมทำอะไรผิดหรือเปล่า?


5
ทำงานกับ GCC 4.4.5 ของฉัน (เช่นให้ข้อผิดพลาด "เกินความกำกวม"); อาจlibstdc++จะล้าสมัยของคุณ?
Fred Foo

3
ใช้งานได้กับ Ideoneซึ่งใช้ GCC 4.5.1
Kerrek SB

5
สิ่งนี้ใช้ได้กับฉันด้วย g ++ 4.6.3 ข้อผิดพลาดของคุณอ้างถึงบรรทัดที่ 11 คุณบอกว่าโปรแกรมของคุณ "ลดลงเป็น" รหัสของคุณเป็นหลัก แต่รหัสที่คุณโพสต์นั้นให้ข้อผิดพลาดนั้นด้วยหรือไม่
Vaughn Cato

@VaughnCato - ใช่นี่เป็นโปรแกรมที่แน่นอน ฉันควรแก้ไขเพื่อให้ชัดเจนยิ่งขึ้น นอกจากนี้สิ่งที่หลงทางที่ฉันทำอยู่ที่นั่น?
Anurag Kalia

2
สิ่งนี้ไม่ได้ผลสำหรับฉันแม้ว่าฉันจะใช้ GCC 5.3.1 อย่างไรก็ตามสิ่งที่แก้ไขก็คือการใช้มาตรฐาน C ++ ในภายหลัง - โดยการรวบรวมด้วยการตั้งค่าสถานะ-std=c++11หรือสูงกว่า
อาร์ตูโรดอนฮวน

คำตอบ:


212

นี่เป็นข้อบกพร่องที่รู้จักภายใต้ MinGW ที่เกี่ยวข้อง Bugzilla ในส่วนความเห็นคุณจะได้รับปะเพื่อให้สามารถทำงานกับ MinGW ได้

ปัญหานี้ได้รับการแก้ไขใน distros MinGW-w64 สูงกว่า GCC 4.8.0 ให้โดยโครงการ MinGW-w64 แม้จะมีชื่อโครงการนี้ยังให้บริการเครื่องมือสำหรับ 32- บิตและ 64- บิต Nuwen MinGW distroยังแก้ปัญหานี้


2
การอภิปรายเพิ่มเติมที่นี่: stackoverflow.com/questions/8542221/…
เบ็น

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_stringไปทำงานโดยการติดตั้ง MinGW 4.8.1 (เฉพาะx32-4.8.1-posix-dwarf-rev5) ผ่าน MinGW-สร้าง ในทางตรงกันข้ามto_stringก็ทำไม่ได้ทำงานร่วมกับ MinGW 4.8.1 ที่ติดตั้งผ่านทั้ง "MinGW-get" การติดตั้งหรือแพคเกจ TDM-จีซี
Cerran

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-builds" เป็นงานสร้างของ 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>


มีวิธีรวม stod ด้วยหรือไม่
แจ็กกี้

ฉันเรียกใช้ฟังก์ชันของคุณจากไฟล์ต้นฉบับอื่น ๆ : patch :: to_string (errorCode) (โดยที่ errorCode is int) และคอมไพเลอร์ให้ข้อผิดพลาดที่บรรทัดนั้น ข้อผิดพลาดคือ: ไม่ได้กำหนดการอ้างอิงถึง `std :: string patch :: to_string <int> (int &) 'อย่างไรก็ตามเมื่อใดก็ตามที่ฉันรวมรหัสของคุณในคอมไพเลอร์ไฟล์ต้นฉบับเดียวกันจะไม่บ่น ฉันพยายามที่จะเข้าใจว่ามีอะไรผิดปกติ
Nikos

1
โปรดทราบว่านี่ไม่ใช่คำตอบที่ถูกต้องเกี่ยวกับเลขศูนย์ต่อท้าย เดิมstd::to_string(0.75)มักจะกลับมา"0.750000"(ค่าดีฟอลต์ sprintf% 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;
}

ฉันยังไม่ได้เปิดใช้ แต่ขอขอบคุณที่แก้ไขปัญหาทันทีของฉัน ตอนนี้ฉันแค่ต้องคิดออกว่ามันทำงานอย่างไร :)
Anurag Kalia

เพียงทราบว่าถ้าคุณต้องการstd::stringคุณต้องการใช้.str()แทน
Christian Mann

1
โปรดทราบว่านี่ไม่ใช่คำตอบที่ถูกต้องเกี่ยวกับเลขศูนย์ต่อท้าย เดิมstd::to_string(0.75)มักจะกลับมา"0.750000"(ค่าดีฟอลต์ sprintf% 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
เป็นเรื่องที่ดีที่จะมีวิธีแก้ปัญหา แต่ฉันคิดว่าวิธีที่ดีที่สุดคือการหาสาเหตุที่วิธีการแก้ปัญหาแบบมาตรฐานไม่ได้รวบรวมมากกว่าการแฮ็กบางอย่างเข้าด้วยกัน
Matt Coubrough

วิธี "มาตรฐาน" (std :: to_string) มักจะใช้งานได้ - ยกเว้นเมื่อไม่เป็นเช่นนั้น sstream เป็นวิธีแก้ปัญหา "มาตรฐาน"
Nick Vence

โปรดทราบว่านี่ไม่ใช่คำตอบที่ถูกต้องเกี่ยวกับเลขศูนย์ต่อท้าย เดิมstd::to_string(0.75)มักจะกลับมา"0.750000"(ค่าดีฟอลต์ sprintf% d รูปแบบ) "0.75"ในขณะนี้จะกลับมา ดูเหตุผลที่นี่: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

12

to_string เป็นปัญหาในปัจจุบันกับ Cygwin

นี่คือคำตอบใหม่สำหรับกระทู้เก่า ใหม่เกิดขึ้นมา แต่ถูกขัดจังหวะอย่างรวดเร็ว Cygwin: g ++ 5.2: 'to_string' ไม่ใช่สมาชิกของ 'std''มาตรฐาน'

แย่มากบางทีเราอาจได้คำตอบที่อัพเดตแล้ว ตาม @Alex แล้ว Cygwin g ++ 5.2 ยังคงไม่ทำงานตั้งแต่วันที่ 3 พฤศจิกายน 2558

เมื่อวันที่ 16 มกราคม 2558 Corinna Vinschen ผู้ดูแล Cygwin ที่ Red Hat กล่าวว่าปัญหาดังกล่าวนี้เป็นข้อบกพร่องของ newlib มันไม่รองรับฟังก์ชั่นคู่ที่ยาวที่สุดและดังนั้นจึงไม่ได้ตระหนักถึง C99

Red Hat คือ

... ยังคงหวังที่จะรับฟังก์ชั่น "long double" เข้าสู่ newlib ณ จุดหนึ่ง

เมื่อวันที่ 25 ตุลาคม 2015 Corrine ยังกล่าว ,

มันจะยังคงดีถ้าคนที่มีความรู้ทางคณิตศาสตร์เล็กน้อยจะมีส่วนร่วมในฟังก์ชั่นคู่ยาวหายไปเพื่อ newlib

ดังนั้นเรามีมัน บางทีพวกเราคนหนึ่งที่มีความรู้และเวลาสามารถมีส่วนร่วมและเป็นฮีโร่ได้

Newlib เป็นที่นี่


ดูว่าพวกเขาย้ายจากการส่งแพตช์ทางไปรษณีย์ไปยังคอมไพล์เพียงแค่ในปีนี้มันรู้สึกท้อแท้ ...
rr-

8

เปลี่ยนมาตรฐาน C ++ เริ่มต้น

จากข้อผิดพลาด (ล้มเหลวในการรวบรวมไฟล์): '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ใน * เป้าหมาย -w64-mingw32 ตั้งแต่ 4.8.0 อย่างไรก็ตามสิ่งนี้ไม่รวมถึงการรองรับ MinGW.org, Cygwin และตัวแปร (เช่น * -pc-msys จาก MSYS2) ดูเพิ่มเติมhttps://cygwin.com/ml/cygwin/2015-01/msg00245.html

ฉันใช้วิธีแก้ปัญหาก่อนที่จะแก้ไขข้อบกพร่องสำหรับ MinGW-w64 การใช้โค้ดต่างจากคำตอบอื่น ๆ นี่คือการเลียนแบบเพื่อ libstdc ++ (เท่าที่จะทำได้) มันไม่จำเป็นต้องมีการสร้างสายธาร แต่ขึ้นอยู่กับส่วนขยาย libstdc ++ แม้ตอนนี้ฉันใช้ mingw-w64 เป้าหมายบน Windows แต่ก็ยังใช้งานได้ดีกับเป้าหมายอื่น ๆ หลายอย่าง (ตราบใดที่long doubleไม่ได้ใช้ฟังก์ชั่น)


2

สำหรับใครก็ตามที่สงสัยว่าทำไมสิ่งนี้ถึงเกิดขึ้นบน Android อาจเป็นเพราะคุณใช้ไลบรารี่มาตรฐาน c ++ ผิด ลองเปลี่ยนไลบรารี c ++ ใน build.gradle จาก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();
    }
}

น่าเสียดายที่เราจะมีปัญหาในบางกรณี ตัวอย่างเช่นสำหรับ const คงที่สมาชิก :

HPP

class A
{
public:

    static const std::size_t x = 10;

    A();
};

CPP

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

นี่คือวิธีหนึ่งในการแก้ปัญหา (เพิ่มประเภทsize_t ):

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

HTH


0

ใน codeblocks ไปที่การตั้งค่า -> การตั้งค่าคอมไพเลอร์ -> ธงคอมไพเลอร์ -> เลือก std 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 และไม่ใช่คำตอบสำหรับคำถาม
Verax

13
อย่าลืมใช้ std :: cout ด้วย! ดีกว่าที่จะนำมาใช้อีกครั้งพร้อมข้อบกพร่องเพิ่มเติมอีกมากมาย
jmc

คุณกำลังทำสิ่งต่าง ๆ ที่ซับซ้อน เพียงones_char = '0' + number % 10;
phuclv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.