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_string
4.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_static
에 c++_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
'IT story' 카테고리의 다른 글
요소에 BOTH 클래스가있는 경우에만 적용 할 CSS 규칙 (0) | 2020.04.09 |
---|---|
Vim의 설정 파일에서“.vimrc”를 주석으로 처리하는 방법은 무엇입니까? (0) | 2020.04.09 |
새 창에서 Chrome 개발자 도구를 여는 방법은 무엇입니까? (0) | 2020.04.09 |
: img 요소에서 작동하지 않습니까? (0) | 2020.04.09 |
테이블의 기본 키에 대한 모범 사례는 무엇입니까? (0) | 2020.04.09 |