to_string은 std의 멤버가 아닙니다 .g ++ (mingw)


245

나는 의미를 위해 단어가 무작위로 번쩍 거리는 작은 어휘 기억 프로그램을 만들고 있습니다. Bjarne Stroustroup이 알려주 듯이 표준 C ++ 라이브러리를 사용하고 싶지만 게이트 밖에서 겉보기에 이상한 문제가 발생했습니다.

long정수를 std::string파일에 저장할 수 있도록 정수 를 변경하고 싶습니다 . 나는 to_string()똑같이 고용 했다. 문제는 g ++ (--‍version 플래그에 언급 된 버전 4.7.0)로 컴파일 할 때 다음과 같이 말합니다.

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 라이브러리에 분명히 존재 한다고 말하고 스택 오버플로 (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 행을 의미합니다. 귀하의 프로그램이 귀하의 코드로 "감소되었습니다"라고 말했지만 게시 한 코드에도 해당 오류가 발생합니까?
본 카토

@VaughnCato-맞습니다. 이것은 정확한 프로그램입니다. 더 명확하게 편집해야합니다. 게다가, 거기에서 나는 길을 잃은 것은 무엇입니까?
Anurag Kalia

2
GCC 5.3.1을 사용하고 있는데도 이것은 작동하지 않습니다. 그러나 문제를 해결하는 것은 최신 C ++ 표준을 사용하는 것입니다. 즉 플래그 -std=c++11이상 으로 컴파일하면 됩니다.
Arturo don Juan

답변:


212

이것은 MinGW에서 알려진 버그입니다. 관련 Bugzilla . 의견 섹션 에서 MinGW와 함께 작동하도록 패치 를 얻을 수 있습니다 .

이 문제는 MinGW-w64 프로젝트 에서 제공하는 GCC 4.8.0보다 높은 MinGW-w64 배포판에서 수정되었습니다 . 이름에도 불구하고이 프로젝트는 64 비트와 함께 32 비트 용 툴체인을 제공합니다. Nuwen는 MinGW 배포판은 이 문제를 해결합니다.


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 이유를 설명 할 수는 없지만 MinGW-builds를 통해 MinGWstd::to_string 4.8.1 (특히 x32-4.8.1-posix-dwarf-rev5) 설치하여 작업해야 합니다 . 반대로 "mingw-get"설치 프로그램 또는 TDM-GCC 패키지를 통해 설치된 MinGW 4.8.1 에서는 작동 to_string하지 않았습니다 .
Cerran

5
패치는 나를 위해 충분하지 않았다, 나는에 있었다 #define _GLIBCXX_USE_C99 1에서 C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h설명 된 바와 같이 여기
주크

3
@Cerran "MinGW-builds"는 MinGW와 다른 프로젝트 인 MinGW-w64의 빌드입니다. 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도 포함시키는 방법이 있습니까?
Jackie

다른 소스 파일 : patch :: to_string (errorCode) (errorCode가 int 인)에서 함수를 호출하면 컴파일러에서 해당 줄에 오류가 발생합니다. 오류 :`std :: string patch :: to_string <int> (int &) '에 대한 정의되지 않은 참조 그러나 동일한 소스 파일 컴파일러에 코드를 포함시킬 때마다 불평하지 않습니다. 무엇이 잘못되었는지 파악하려고합니다.
Nikos

1
이것은 후행 0과 관련하여 정확한 해결책이 아닙니다. 원본 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
이것은 후행 0과 관련하여 정확한 해결책이 아닙니다. 원본 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
해결 방법을 사용하는 것이 좋지만 일반적으로 std 솔루션이 왜 함께 컴파일되지 않고 컴파일되지 않는지 알아내는 것이 가장 좋습니다.
Matt Coubrough

"표준"방식 (std :: to_string)은 작동하지 않는 경우를 제외하고 종종 작동합니다. sstream은 "표준"해결 방법입니다.
Nick Vence

이것은 후행 0과 관련하여 정확한 해결책이 아닙니다. 원본 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이'표준 '의 멤버가 아닙니다 .

너무 나빴을 수도 있습니다. @Alex에 따르면 Cygwin g ++ 5.2는 2015 년 11 월 3 일부터 작동하지 않습니다.

2015 년 1 월 16 일 Red Hat의 Cygwin 관리자 인 Corinna Vinschen은이 문제 가 newlib의 단점 이라고 말했습니다 . 대부분의 긴 이중 기능을 지원하지 않으므로 C99를 인식하지 못합니다.

레드햇은

... "long double"기능을 한 시점에서 newlib로 가져 오기를 희망합니다.

10 월 25 일, 2015 코린는 말했다 ,

약간의 수학 지식을 가진 사람이 누락 된 long double 함수를 newlib에 기여하면 여전히 좋을 것입니다.

그래서 우리는 그것을 가지고 있습니다. 아마 지식과 시간을 가진 우리 중 한 명이 영웅이되고 기여할 수 있습니다.

Newlib가 여기 있습니다 .


그들이 올해 만 메일을 통해 패치를 git으로 보내는 방법을
살펴보면

8

기본 C ++ 표준 변경

에서 (컴파일 실패 FILE) 오류 : 'to_string' '표준'의 멤버가 아닙니다

-std = c ++ 98

으로 (컴파일 FILE 성공)

-std = c ++ 11 또는 -std = c ++ 14

Cygwin G ++ (GCC) 5.4.0에서 테스트


3

to_string ()은 c ++ 11에만 존재하므로 c ++ 버전이 적은 경우 sprintf 또는 ostringstream 과 같은 대체 방법을 사용하십시오


2

사실 libstdc ++는 std::to_string4.8.0 부터 * -w64-mingw32 대상에서 실제로 지원 되었습니다 . 그러나 MinGW.org, Cygwin 및 변형 (예 : MSYS2의 * -pc-msys)에 대한 지원은 포함되지 않습니다. https://cygwin.com/ml/cygwin/2015-01/msg00245.html참조하십시오 .

MinGW-w64에 대한 버그 가 해결 되기 전에 해결 방법 을 구현 했습니다 . 다른 답변의 코드와 다른 점은 libstdc ++의 모방입니다 (가능한 한). 문자열 스트림 구성은 필요하지 않지만 libstdc ++ 확장에 따라 다릅니다. 지금도 Windows에서 mingw-w64 대상을 사용하고 있지만 long double기능을 사용하지 않는 한 여러 다른 대상에서 여전히 잘 작동합니다 .


2

왜 안드로이드에서 이런 일이 발생하는지 궁금해하는 사람은 아마도 잘못된 C ++ 표준 라이브러리를 사용하고 있기 때문일 것입니다. 에서 build.gradle에서 C ++ 라이브러리를 변경 시도 gnustl_staticc++_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

코드 블록에서 설정-> 컴파일러 설정-> 컴파일러 플래그-> 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.