IT story

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

hot-time 2020. 4. 9. 08:11
반응형

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


나는 의미가 무작위로 나에게 단어가 깜박이는 작은 어휘 기억 프로그램을 만들고 있습니다. 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플래그 로 설정할 수 있다고 말합니다 . 내가 뭘 잘못하고 있죠?


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

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


#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>


제안한대로 컴파일러 버전에 문제가있을 수 있습니다.

을 변환하려면 다음 코드를 사용하여 시도 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;
}

이 기능을 사용하십시오 ...

    #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

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가 여기 있습니다 .


기본 C ++ 표준 변경

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

-std = c ++ 98

으로 (컴파일 FILE 성공)

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

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


사실 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기능을 사용하지 않는 한 여러 다른 대상에서 여전히 잘 작동합니다 .


왜 안드로이드에서 이런 일이 발생하는지 궁금해하는 사람은 잘못된 C ++ 표준 라이브러리를 사용하고 있기 때문일 것입니다. 에서 build.gradle에서 C ++ 라이브러리를 변경 시도 gnustl_staticc++_static와 C ++ 표준 귀하의 CMakeLists.txt에에서 -std=gnu++11-std=c++11


다음과 같이 템플릿 라이트 솔루션을 사용하는 경우 :

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.


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


코드 블록에서 설정-> 컴파일러 설정-> 컴파일러 플래그-> std c ++ 11 완료로 이동하십시오. 나는 같은 문제가 있었다 ... 지금 작동하고 있습니다!


이것은 나에게도 일어났다. 컴파일러 업데이트에 대해 걱정하는 대신 빠른 기능을 작성했다.

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

참고 URL : https://stackoverflow.com/questions/12975341/to-string-is-not-a-member-of-std-says-g-mingw

반응형