2016-07-21 1 views
1

나는 미쳐 가고, cygwin g ++ 컴파일러의 버그인가?(uint8_t) 0x00을 std :: string에 추가하면 cygwin에서 모호한 오버로드 오류가 발생합니까?

이 작동 :

std::string record; 
record += (uint8_t)1; 

또한 값을 0으로 CONST 변수를 추가로 완전히 멋지다 :

:

const uint8_t tZero = 0x00; 
std::string record; 
record += tZero; 

그러나,이 코드를 실행하면 모호한 운영자 과부하 오류가 발생합니다

std::string record;  
record += (uint8_t)0; 

제공되는 후보는 명시 적 캐스트, 특히 sinc 전자 후보자 중 하나가 오류에 주어진 것과 동일한 것으로 보인다

sources/logger.cpp:55:20: error: ambiguous overload for `operator+=' (operand types are `std::string {aka std::basic_string<char>}' and `uint8_t {aka unsigned char}') 
    record += (const uint8_t)0; 

note: candidates: 
    operator+=(const basic_string& __str) 
    operator+=(const _CharT* __s) 
    operator+=(_CharT __c) 

이 오류는 또한 비주얼 스튜디오에 나타나지 않습니다, 그것은 컴파일하고 내가 기대하는 단지로 × 00 바이트를 추가합니다.

참고로 바이너리 로그 데이터 용 버퍼로 문자열을 사용하고 있습니다. 아마 더 나은 컨테이너를 사용할 수 있지만, + 바이트 수있는 것이 너무 유용하지 않습니다.

cygwin의 문자열 구현에 버그가 있습니까? 아니면 0 일 때 오류가 발생합니까? const 변수를 사용하여 오류를 수정하는 데 신경 쓰지 않지만이 프로세스가 다른 값을 가진 코드를 통해 여러 번 반복되므로 이상하게 보일 것입니다.

+1

'char'에 캐스트 해보세요. – kennytm

+0

_ "특히 후보자 중 하나가 오류에서 제공 한 내용과 동일하기 때문에 다음과 같습니다."_ 어느 것입니까? 'char'는'unsigned char'와 동일하지 않습니다. –

+0

@kennytm 내 변수의 크기를 명시 적으로 지정하는 것이 좋습니다. (저는 많은 임베디드 개발을합니다.) 그래서'char'에 캐스트하지 않았습니다. 대답에 따르면, 당신은 정확하고, 그것은 작동합니다. @ 조나단 나는 서명이 일치하는 패턴을 고르는 데 중요하지 않다고 생각했다. 그렇지 않은가요? – DweebsUnited

답변

3

이것은 C++ 언어의 최근 변경 사항입니다. 요즘 코드는 operator+=(_CharT)으로 전화해야합니다. 과거에는 코드가 const uint8_t tZero = 0x00; 인 경우에도 모호성으로 인해 실패했습니다. 당신은 그 변화가 부분적으로 구현 된 컴파일러를 다루고 있습니다.

언어가 변경되기 전에 값이 0 인 정수 상수식이 암시 적으로 모든 포인터 유형으로 변환되어 null 포인터를 생성했습니다. 그래서 (uint8_t)0char 또는 const char *으로 변환 할 수 있습니다.

이제 문자 그대로 0 만 포인터 유형으로 변환 할 수 있습니다. tZero 또는 심지어 (uint8_t)0const char *으로 더 이상 변환하지 않아야합니다. 이는 모호성을 해결합니다. char으로의 변환 만 가능할 수 있습니다.

+0

그건 의미가 있습니다. 나는'char'가 단지 typedef'd'sint8_t'라고 인상을 받았다. 그러나 나는 다르게 취급된다고 말하는 것이 맞다. 저는 항상 고정 크기의 정수형을 사용하기를 선호합니다. 그래서 'char'로 캐스트하지 않았습니다 (저는 많은 Arduino 개발을하고, 어떤 타입의 타입인지 명시 적으로 말합니다). – DweebsUnited

+1

@DweebsUnited'sint8_t'와'uint8_t'는 구별 유형이기 때문에'char'와'sint8_t'가 같은 타입 인 시스템에서'char'와'uint8_t'는 반드시 다른 타입이 될 것입니다. – hvd

+0

모든 도움에 감사드립니다.컴파일러가 내가하고 싶은 것을 추측하게하는 것에 너무 많은 신뢰를 둔 것 같습니다. 나는 또한 문자열이 실제로 내가 그들과하고있는 일을하도록 고안되지 않았다는 것을 깨닫기 시작했습니다. – DweebsUnited

관련 문제