2013-04-19 3 views
0

오버로드 된 함수가 있지만 테스트 코드에 오류가 발생합니다.오버로드 된 함수가 모호한 오류가 발생합니다.

inline void tt(uint8_t& v) { } 
inline void tt(int8_t& v) { } 
inline void tt(char& v) { } 
inline void tt(uint16_t& v) { } 
inline void tt(int16_t& v) { } 
inline void tt(uint32_t& v) { } 
inline void tt(int32_t& v) { } 
inline void tt(uint64_t& v) { } 
inline void tt(int64_t& v) { } 

int main(int argc, char* argv[]) { 
    unsigned char t1; 
    signed char t2; 
    unsigned short t3; 
    short t4; 
    unsigned int t5; 
    int t6; 
    unsigned long t7; 
    long t8; 
    char t9; 

    tt(t1); // ok 
    tt(t2); // ok 
    tt(t3); // ok 
    tt(t4); // ok 
    tt(t5); // ok 
    tt(t6); // ok 
    tt(t7); // error 
    tt(t8); // error 
    tt(t9); // ok 
} 

왜 모두 (서명) 길이를 제외하고 노력하고 있습니다? 길이가 standard 인 경우 (적어도 다른 모든 유형과 유사) 32 비트입니다.

There are five standard signed integer types: “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list.

제가

코드
inline void tt(unsigned long int& v) { } 
inline void tt(long int& v) { } 

삽입함으로써이 문제를 방지 할 수있다. 나는이 캐스트가 왜 작동하지 않는지를 알고 싶다.

+1

1) 확실히 표준이 아닙니다. [이것을보십시오] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf). 2) 표 아래의 메모를 읽지 않았습니다. 공식적으로 적어도 32 비트입니다. – chris

+0

@CaptainObvlious 나는 그것을 시도했지만 또한 작동하지 않습니다. – user1810087

답변

2

tt을 오버로드 한 유형의 컴파일러가 long과 같아서 컴파일러에 적용되지 않습니다. 다른 컴파일러에서는 하나 이상의 컴파일러가있을 수 있습니다. 대체로 int32_tint의 별명이고 int64_tlong long의 별명입니다.

예컨대, intlong가 동일한 크기이더라도, 경우, 이들은 동일 , 그래서 하나의 참조는 다른 기준으로 변환 할 수 없다. 사실 표준의 일부가 다른 유형이라고 말한 부분을 인용했습니다.

+0

이것은 long long이 int64_t 인 것을 보여줍니다. 최소한 gcc에서는 다음을 확인하십시오. http://ideone.com/clone/GmP0I0 –

+0

@ArneMertz : 사이트가 실행되는 특정 플랫폼 ([32 비트 Linux] (http : // ideone. com/2bH16Z)). 내 컴퓨터 (64 비트 Linux)에서는 오래되었습니다. –

+0

네, 부정확하게해서 죄송합니다. –

0

C++ 표준 (초안 N3225)는 말한다 :

다섯 개 표준 부호있는 정수 유형이 있습니다 : "서명 문자", "짧은 INT", "INT", "긴 INT"및 "오래 오래가 int ". 이 목록에서 각 유형은 목록에있는 유형보다 적어도 많은 저장 영역을 제공합니다.

MSVC12에서 stdint.h에 typedef unsigned int uint32_t;이 표시됩니다.

부호없는 long 또한 32 비트이지만 여전히 다른 유형입니다.

따라서 어떤 함수도 (참조되지 않은) long 참조를 인수로 사용하기 위해 오버로드되지 않습니다.

-edit- 매개 변수를 값으로 사용하도록 함수를 변경하면 tt()에 대한 모호한 호출로 인해 오류가 발생하게됩니다.

관련 문제