to_string, std'nin bir üyesi değil, diyor g ++ (mingw)


245

Kelimelerin anlamlar için bana rastgele yanıp söneceği küçük bir kelime hatırlama programı yapıyorum. Bjarne Stroustroup bize söylediği gibi standart C ++ kitaplığı kullanmak istiyorum, ama hemen kapıdan garip bir sorunla karşılaştım.

Bir longtamsayı std::stringbir dosyada saklayabilmek için içine değiştirmek istiyorum . Ben de to_string()aynısını çalıştırdım. Sorun, bunu g ++ (derleme 4.7.0, --‍version bayrağında belirtildiği gibi) ile derlediğimde şöyle diyor:

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'

Bu hatayı veren programım:

#include <string>

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

Ancak, msdn kütüphanesinin açıkça var olduğunu ve Yığın Taşması (g ++ sürüm 4.5 için) ile ilgili daha önceki bir sorunun-std=c++0x bayrakla açılabileceğini söylediği için olamayacağını biliyorum . Neyi yanlış yapıyorum?


5
Benim GCC 4.4.5 ile çalışır (yani, "belirsiz aşırı yük" hatası verir); belki senin libstdc++eskimiş?
Fred Foo

3
Bu Ideone çalışır GCC 4.5.1 kullanır.
Kerrek SB

5
Bu benim için g ++ 4.6.3 ile çalışır. Hatanız satır 11'e atıfta bulunuyor. Programınızın kodunuzu "temelde" azaltıldığını "söylüyorsunuz, ancak gönderdiğiniz kod da bu hatayı veriyor mu?
Vaughn Cato

@VaughnCato - Evet, bu tam program. Daha net hale getirmek için düzenlemeliyim. Ayrıca, orada yaptığım bu sokak içi nedir?
Anurag Kalia

2
GCC 5.3.1 kullanmama rağmen bu benim için de işe yaramıyor. Bununla birlikte, bunu düzelten şey daha sonraki bir C ++ standardını kullanmaktır - yani bayrak -std=c++11veya daha yüksek bir derleme ile .
Arturo don Juan

Yanıtlar:


212

Bu MinGW altında bilinen bir hatadır. İlgili Bugzilla . Yorumlar bölümünde MinGW ile çalışmasını sağlamak için bir yama alabilirsiniz .

Bu sorun, MinGW-w64 projesi tarafından sağlanan GCC 4.8.0'dan daha yüksek MinGW-w64 dağıtımlarında giderilmiştir . İsme rağmen, proje 32 bit için 64 bit ile birlikte araçlar sağlar. Nuwen MinGW'nin dağıtıma da bu sorunu çözer.


2
Burada daha fazla tartışma: stackoverflow.com/questions/8542221/…
Ben

11
MinGW-w64 sürüm 4.8.1 kullanıyorum ve çalışmıyor. Sorudan tam programı kopyaladım. Hala 'to_string' 'std' hata üyesi değil olsun. Ben derledim: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664

5
@ zam664 Nedenini açıklayamıyorum, ama std::to_stringMinGW 4.8.1'i (özellikle x32-4.8.1-posix-dwarf-rev5) MinGW-derlemeleri aracılığıyla yükleyerek işe başladım . Buna karşılık, to_stringyaptığımız değil MinGW 4.8.1 "mingw-get" yükleyici veya TDM-GCC paketine aracılığıyla ya yüklü çalışır.
Cerran

5
Yama benim için yeterli değildi, burada tarif #define _GLIBCXX_USE_C99 1edildiği C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hgibi yapmalıydım
Zook

3
@Cerran "MinGW-builds", MinGW'den farklı bir proje olan MinGW-w64'ün yapılarıdır. MinGW-w64'ün çatallanmasının bir nedeni, aslında bu iş parçacığının olduğu gibi hataları düzeltebilmeleriydi.
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' ;
}

dahil etmeyi unutma #include <sstream>


İstenilenleri dahil etmenin bir yolu var mı?
Jackie

İşlevinizi başka bir kaynak dosyadan çağırıyorum: patch :: to_string (hataKodu) (burada hataKodu int) ve derleyici bana bu satırda bir hata veriyor. Hata şudur: std :: string patch :: to_string <int> (int &) 'undefined referans Ancak kodunuzu aynı kaynak dosya derleyicisine eklediğimde şikayet etmiyor. Neyin yanlış olduğunu anlamaya çalışıyorum.
Nikos

1
Bunun sondaki sıfırlarla ilgili kesin bir çözüm olmadığını lütfen unutmayın. Orijinal std::to_string(0.75)genellikle geri döner "0.750000"(varsayılan sprintf% d biçimi), bu döner "0.75". Nedeni için buraya bakın: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

47

Önerildiği gibi bu derleyici sürümüyle ilgili bir sorun olabilir.

Bir dönüştürmek için aşağıdaki kodu kullanmayı deneyin longiçin std::string:

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

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

Ben çalıştırmadım ama anında ikilemi çözdüğünüz için teşekkür ederim. Şimdi sadece nasıl çalıştığını anlamaya ihtiyacım var. :)
Anurag Kalia

Sadece bir not istiyorsanız std::string, .str()bunun yerine kullanmak istediğinizi unutmayın .
Christian Mann

1
Bunun sondaki sıfırlarla ilgili kesin bir çözüm olmadığını lütfen unutmayın. Orijinal std::to_string(0.75)genellikle geri döner "0.750000"(varsayılan sprintf% d biçimi), bu döner "0.75". Nedeni için buraya bakın: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

20

Bu işlevi kullanın ...

    #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
Lütfen, kodun anlaşılması ne kadar kolay olursa olsun, yanıtlarınıza bir açıklama (en azından yorumlar) ekleyin.
vefthym

4
Bir geçici çözüm bulmak iyidir, ancak std çözümünün neden bir şeyleri kesmek yerine neden derlenmediğini anlamak genellikle en iyisidir
Matt Coubrough

"Standart" yol (std :: to_string) genellikle işe yaramıyor. sstream "standart" geçici çözümdür.
Nick Vence

Bunun sondaki sıfırlarla ilgili kesin bir çözüm olmadığını lütfen unutmayın. Orijinal std::to_string(0.75)genellikle geri döner "0.750000"(varsayılan sprintf% d biçimi), bu döner "0.75". Nedeni için buraya bakın: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

12

to_string, Cygwin ile ilgili güncel bir sorundur

İşte eski bir konuya yeni bir cevap. Yeni bir tane geldi, ancak hızla bozuldu, Cygwin: g ++ 5.2: 'to_string' 'std' üyesi değil .

Çok kötü, belki güncellenmiş bir cevap alabilirdik. @Alex'e göre Cygwin g ++ 5.2, 3 Kasım 2015 tarihinden itibaren hala çalışmıyor.

16 Ocak 2015'te Red Hat'taki bir Cygwin destekçisi Corinna Vinschen, sorunun newlib'in bir eksikliği olduğunu söyledi. Çoğu uzun çift fonksiyonu desteklemez ve bu nedenle C99'un farkında değildir.

Red Hat,

... yine de "uzun çift" işlevini bir noktada newlib'e almayı umuyor.

25 Ekim 2015'te Corrine ,

Biraz matematik bilgisine sahip birisinin, newlib'e eksik çift işlevlerin katkısı olması yine de iyi olurdu.

İşte burada. Belki de bilgiye ve zamana sahip olan bizlerden biri kahraman olabilir ve katkıda bulunabilir.

Newlib burada .


Sadece bu yıl
git'e

8

Varsayılan C ++ standardını değiştirme

Gönderen (DERLEME BAŞARISIZ DOSYASI) hatası: 'to_string' 'std' üyesi değildir

-std = C ++ 98

To (DERLEME DOSYA BAŞARILI)

-std = c ++ 11 veya -std = c ++ 14

Cygwin G ++ (GCC) 5.4.0'da test edildi


3

to_string () yalnızca c ++ 11'de bulunur, bu nedenle c ++ sürümü daha azsa sprintf veya ostringstream gibi bazı alternatif yöntemler kullanın


2

Gerçek şu ki libstdc ++ std::to_string, 4.8.0'dan beri * -w64-mingw32 hedeflerinde desteklenmektedir . Ancak, bu MinGW.org, Cygwin ve varyantları (MSYS2'den * -pc-msys) desteklemez. Ayrıca bkz . Https://cygwin.com/ml/cygwin/2015-01/msg00245.html .

Hata MinGW-w64 için çözülmeden önce bir geçici çözüm uyguladım . Diğer yanıtlarda kodlamaktan farklı olması, libstdc ++ 'a (mümkün olduğu kadar) benzemektedir. Dize akışı oluşturma gerektirmez, ancak libstdc ++ uzantılarına bağlıdır. Şimdi bile Windows'ta mingw-w64 hedeflerini kullanıyorum, diğer birçok hedef için de iyi çalışıyor ( long doubleişlevler kullanılmadığı sürece ).


2

Bunun Android'de neden olduğunu merak eden herkes için muhtemelen yanlış bir c ++ standart kitaplığı kullanıyorsunuz. Adresinin build.gradle c ++ kütüphanesi değiştirmeyi deneyin gnustl_staticiçin c++_staticve c ++ standart sizin CMakeLists.txt gelen -std=gnu++11etmek-std=c++11


1

Aşağıdaki gibi bir şablon ışık çözümü kullanırsak (yukarıda gösterildiği gibi):

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

Ne yazık ki, bazı durumlarda sorun yaşayacağız. Örneğin, statik sabit için üyeler için:

hpp

class A
{
public:

    static const std::size_t x = 10;

    A();
};

cpp

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

Ve bağlantı:

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

Sorunu çözmenin bir yolu ( size_t türüne ekleyin ):

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

HTH.


0

kod bloklarında ayar -> derleyici ayarı -> derleyici bayrağı -> std c ++ 11'i seçin. Aynı problemi yaşadım ... şimdi çalışıyor!


-4

Bu da benim başıma geldi, derleyicimi güncellemekten endişe etmek yerine hızlı bir işlev yazdım.

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
Bu std :: to_string yerine geçmez ve kesinlikle sorunun cevabı değildir.
Verax

13
Std :: cout'u da uygulamayı unutmayın! Kök sorunu çözmekten çok daha fazla hata ile yeniden uygulamak çok daha iyi!
jmc

işleri aşırı karmaşık hale getiriyorsunuz. Justones_char = '0' + number % 10;
phuclv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.