to_string bukan anggota std, kata g ++ (mingw)

245

Saya membuat program pengingat kosakata kecil di mana kata-kata akan diucapkan kepada saya secara acak untuk artinya. Saya ingin menggunakan pustaka C ++ standar seperti yang dikatakan Bjarne Stroustroup kepada kami, tetapi saya telah menemukan masalah yang tampaknya aneh di luar gerbang.

Saya ingin mengubah longinteger menjadi std::stringagar dapat menyimpannya dalam file. Saya telah bekerja to_string()untuk hal yang sama. Masalahnya adalah, ketika saya mengompilasinya dengan g ++ (versi 4.7.0 seperti yang disebutkan dalam flag --‍version), ia mengatakan:

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'

Program saya yang memberikan kesalahan ini adalah:

#include <string>

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

Tapi, saya tahu itu tidak mungkin karena perpustakaan msdn dengan jelas mengatakan itu ada dan pertanyaan sebelumnya tentang Stack Overflow (untuk g ++ versi 4.5) mengatakan bahwa itu dapat dihidupkan dengan -std=c++0xflag. Apa yang saya lakukan salah?

Anurag Kalia
sumber
5
Bekerja dengan GCC 4.4.5 saya (yaitu, memberikan kesalahan "ambigu berlebihan berlebihan"); mungkin Anda libstdc++sudah ketinggalan zaman?
Fred Foo
3
Ini bekerja pada Ideone , yang menggunakan GCC 4.5.1.
Kerrek SB
5
Ini berfungsi untuk saya dengan g ++ 4.6.3. Kesalahan Anda mengacu pada baris 11. Anda mengatakan program Anda "pada dasarnya telah dikurangi menjadi" kode Anda, tetapi apakah kode yang Anda posting juga memberikan kesalahan itu?
Vaughn Cato
@VaughnCato - Ya ini adalah program yang tepat. Saya harus mengeditnya agar lebih jelas. Plus, apa yang saya lakukan di sana?
Anurag Kalia
2
Ini juga tidak berfungsi untuk saya, meskipun saya menggunakan GCC 5.3.1. Namun, perbaikannya adalah hanya menggunakan standar C ++ yang lebih baru - yaitu dengan mengkompilasi dengan flag -std=c++11atau lebih tinggi.
Arturo don Juan

Jawaban:

212

Ini adalah bug yang dikenal di bawah MinGW. Bugzilla yang relevan . Di bagian komentar Anda bisa mendapatkan tambalan untuk membuatnya berfungsi dengan MinGW.

Masalah ini telah diperbaiki di distro MinGW-w64 lebih tinggi dari GCC 4.8.0 yang disediakan oleh proyek MinGW-w64 . Terlepas dari namanya, proyek ini menyediakan toolchains untuk 32-bit bersama dengan 64-bit. The Nuwen MinGW distro juga memecahkan masalah ini.

Rapptz
sumber
2
Diskusi lebih lanjut di sini: stackoverflow.com/questions/8542221/…
Ben
11
Saya menggunakan MinGW-w64 versi 4.8.1 dan tidak berfungsi. Saya menyalin program yang tepat dari pertanyaan. Saya masih mendapatkan 'to_string' bukan anggota kesalahan 'std'. Saya mengkompilasinya sebagai: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664
5
@ zam664 Saya tidak bisa menjelaskan mengapa, tetapi saya harus std::to_stringbekerja dengan menginstal MinGW 4.8.1 (khusus, x32-4.8.1-posix-dwarf-rev5) melalui MinGW-builds . Sebaliknya, to_stringlakukan tidak bekerja dengan MinGW 4.8.1 diinstal melalui baik "mingw-get" installer atau paket TDM-GCC.
Cerran
5
Tambalan itu tidak cukup bagi saya, saya harus #define _GLIBCXX_USE_C99 1masuk C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hseperti yang dijelaskan di sini
Zook
3
@Cerran "MinGW-builds" adalah build dari MinGW-w64, proyek yang berbeda dari MinGW. Salah satu alasan mengapa MinGW-w64 dipotong adalah agar mereka dapat memperbaiki bug seperti yang ada di utas ini.
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' ;
}

jangan lupa sertakan #include <sstream>

edgarmtze
sumber
Apakah ada cara untuk memasukkan stod juga?
Jackie
Saya memanggil fungsi Anda dari beberapa file sumber lain: patch :: to_string (errorCode) (di mana errorCode adalah int) dan kompiler memberi saya kesalahan di baris itu. Kesalahannya adalah: undefined reference ke `std :: string patch :: to_string <int> (int &) 'Namun setiap kali saya memasukkan kode Anda dalam kompiler file sumber yang sama tidak mengeluh. Saya mencoba mencari tahu apa yang salah.
Nikos
1
Harap dicatat bahwa ini bukan solusi yang tepat untuk melacak nol. Dokumen asli std::to_string(0.75)biasanya akan kembali "0.750000"(format sprintf% d default) sementara ini akan kembali"0.75" . Lihat di sini untuk alasan: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
47

Seperti yang disarankan ini mungkin masalah dengan versi kompiler Anda.

Coba gunakan kode berikut untuk mengonversi a longmenjadi std::string:

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

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}
andre
sumber
Saya belum menjalankannya, tetapi terima kasih telah menyelesaikan dilema langsung saya. Sekarang saya hanya perlu memikirkan cara kerjanya. :)
Anurag Kalia
Perhatikan bahwa jika Anda menginginkan std::string, Anda ingin menggunakannya .str().
Christian Mann
1
Harap dicatat bahwa ini bukan solusi yang tepat untuk melacak nol. Dokumen asli std::to_string(0.75)biasanya akan kembali "0.750000"(format sprintf% d default) sementara ini akan kembali"0.75" . Lihat di sini untuk alasan: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
20

Gunakan fungsi ini ...

    #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
Nirav Patel
sumber
2
Tolong, tambahkan beberapa penjelasan (setidaknya komentar) dalam jawaban Anda, tidak peduli semudah apa pun kode tersebut.
vefthym
4
Ada baiknya untuk mencari solusinya, tetapi saya pikir biasanya yang terbaik untuk mencari tahu mengapa solusi std tidak mengkompilasi daripada meretas sesuatu bersama
Matt Coubrough
Cara "standar" (std :: to_string) sering bekerja - kecuali jika tidak. sstream adalah solusi "standar".
Nick Vence
Harap dicatat bahwa ini bukan solusi yang tepat untuk melacak nol. Dokumen asli std::to_string(0.75)biasanya akan kembali "0.750000"(format sprintf% d default) sementara ini akan kembali"0.75" . Lihat di sini untuk alasan: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
12

to_string adalah masalah saat ini dengan Cygwin

Inilah jawaban baru untuk sebuah utas lama. Yang baru memang muncul tetapi cepat dibatalkan, Cygwin: g ++ 5.2: 'to_string' bukan anggota 'std' .

Sayang sekali, mungkin kita akan mendapat jawaban yang diperbarui. Menurut @Alex, Cygwin g ++ 5.2 masih belum berfungsi pada 3 November 2015.

Pada 16 Januari 2015 Corinna Vinschen, seorang pengelola Cygwin di Red Hat mengatakan masalahnya adalah kekurangan dari newlib. Ini tidak mendukung fungsi ganda paling lama dan karenanya tidak menyadari C99.

Red Hat adalah,

... masih berharap untuk mendapatkan fungsionalitas "long double" ke newlib pada satu titik.

Pada 25 Oktober 2015 Corrine juga mengatakan ,

Akan tetap menyenangkan jika seseorang dengan sedikit pengetahuan matematika akan menyumbang fungsi ganda yang hilang untuk newlib.

Jadi begitulah. Mungkin salah satu dari kita yang memiliki pengetahuan, dan waktu, dapat berkontribusi dan menjadi pahlawan.

Newlib ada di sini .

Komunitas
sumber
Melihat bagaimana mereka bermigrasi dari mengirim tambalan melalui pos ke git hanya tahun ini, rasanya mengecewakan ...
rr-
8

Ubah standar C ++ standar

Kesalahan Dari (COMPILE FILE FAILED): 'to_string' bukan anggota dari 'std'

-std = c ++ 98

To (COMPILE FILE SUCCESSFUL)

-std = c ++ 11 atau -std = c ++ 14

Diuji pada Cygwin G ++ (GCC) 5.4.0

Joma
sumber
3

to_string () hanya ada di c ++ 11 jadi jika versi c ++ kurang gunakan beberapa metode alternatif seperti sprintf atau ostringstream

Aishwarya Mittal
sumber
2

Faktanya adalah bahwa libstdc ++ sebenarnya didukung std::to_stringdalam target * -w64-mingw32 sejak 4.8.0 . Namun, ini tidak termasuk dukungan untuk MinGW.org, Cygwin dan varian (mis. * -Pc-msys dari MSYS2). Lihat juga https://cygwin.com/ml/cygwin/2015-01/msg00245.html .

Saya telah menerapkan solusi sebelum bug diselesaikan untuk MinGW-w64. Menjadi berbeda dengan kode pada jawaban lain, ini adalah mimic ke libstdc ++ (mungkin). Itu tidak memerlukan konstruksi aliran string tetapi tergantung pada ekstensi libstdc ++. Bahkan sekarang saya menggunakan target mingw-w64 di Windows, masih berfungsi dengan baik untuk beberapa target lainnya (selama long doublefungsi tidak digunakan).

FrankHB
sumber
2

Bagi siapa pun yang bertanya-tanya mengapa ini terjadi pada Android, itu mungkin karena Anda menggunakan pustaka c ++ standar yang salah. Coba ubah pustaka c ++ di build.gradle Anda dari gnustl_staticmenjadi c++_staticdan standar c ++ di CMakeLists.txt Anda dari -std=gnu++11menjadi-std=c++11

kynnysmatto
sumber
1

Jika kita menggunakan solusi template-light (seperti yang ditunjukkan di atas) seperti berikut:

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

Sayangnya, dalam beberapa kasus kita akan mengalami masalah. Misalnya, untuk anggota const statis :

hpp

class A
{
public:

    static const std::size_t x = 10;

    A();
};

cpp

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

Dan menghubungkan:

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

Berikut adalah salah satu cara untuk menyelesaikan masalah (tambahkan ke tipe size_t ):

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

HTH.

Boris
sumber
0

di codeblock pergi ke pengaturan -> pengaturan compiler -> flag compiler -> pilih std c ++ 11 selesai. Saya memiliki masalah yang sama ... sekarang berhasil!

5hifaT
sumber
-4

Ini terjadi pada saya juga, saya hanya menulis fungsi cepat daripada khawatir tentang memperbarui kompiler saya.

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;
}
Jeff Pope
sumber
29
Ini bukan pengganti std :: to_string dan jelas bukan jawaban untuk pertanyaan itu.
Verax
13
Jangan lupa untuk mengimplementasikan std :: cout juga! Jauh lebih baik untuk menerapkan kembali dengan banyak bug tambahan daripada mencari tahu masalah root!
jmc
Anda membuat hal-hal yang terlalu kompleks. Justones_char = '0' + number % 10;
phuclv