2009-07-02 7 views
2

우리는이 같은 약 보이는 몇 가지 코드가 있습니다과부하 해상도

// Two enums that differ entirely. 
enum A { a1, a2 }; 
enum B { b1, b2 }; 

// Functions to convert in some meaningful way between them 
A convert(B); 
B convert(A); 

지금, 우리의 컴파일러는 가고 우리가 예상 한 정확하게 수행합니다. convert(a1)B convert(A) 등으로 전화합니다. 그러나 Lint를 사용하여 코드를 살펴보면 오류 31이 발생합니다.이 문제는 열거 형의 근본적인 정수 유형이 동일하고 Lint에서 해당 열거 형을 처리 할 수 ​​있다고 생각됩니다.

내가 가진 질문은 : 코드 표준인가, 아니면 이것은 실수로 컴파일러 기능을 사용하는 것입니까?

+0

부록, 오류 (31)는 "함수를 재정의하려고 시도". 나는이 질문에주의를 기울이고 기꺼이 관련 표준어를 가진 대답에 진드기를 붙일 것이다. –

답변

4

이 코드는 표준이며 정확합니다. 버그는 LINT에 있습니다

+0

나는 똑같은 의견을 가지고 있지만 조금 더 확장 할 수있는 기회가 있습니까? 나는 내 앞에 챕터와 절이 없다 : ( –

0

이 방법으로 typedef'ed 열거 형 대신 열거 형을 반환하는 것이 표준으로 간주 될지 모르겠지만 틀릴 수 있습니다. 또한 C 프로그래머로서 두 함수에 동일한 이름을 사용하는 것을 피할 것입니다 (오버로드가 불가능하므로). 실수를하기 쉽기 때문에 C++에서는 피하는 경향이 있습니다. 나는이 코드를 작성한다면

, 내가 같은 것이다 : 그러나

typedef enum { a1, a2 } A; 
typedef enum { b1, b2 } B; 
A convertBToA(B BInstance); 
B convertAToB(A AInstance); 

을, 나는 린트가와 (C++에서) 행복하기를 기대 :

typedef enum { a1, a2 } A; 
typedef enum { b1, b2 } B; 
A convert(B BInstance); 
B convert(A AInstance); 
+0

같은 이름을 사용하면 템플릿에서 함수를 호출하는 것이 쉬워진다. –

+0

True. 나는 이것을 과거에 사용했지만 C 코드를 많이 쓰는 것 같다. 불가능하다.) 나는 모든 것에 별개의 이름을 부여하는 습관이있다 .MISRA-C++ 규칙은 오버로딩을 배제하지는 않지만 그것에 관련된 많은 제한이 있으므로주의해서 사용해야한다. – DrAl

+0

typedef 다른 타입의 동의어입니다. typedef 이름과 typedef를 사용하는 것의 유일한 차이점은 객체 또는 함수는 typedef의 이름을 숨길 수 없다는 것입니다. –