2015-01-05 1 views
0

그래서 enum을 std :: string에 연결하려고합니다. 이를 위해 다음 코드를 작성했습니다.C++ : enum을 std :: string에 연결하십시오.

typedef enum { NODATATYPE = -1, 
      DATATYPEINT, 
      DATATYPEVARCHAR 
      } DATATYPE; 
inline std::string operator+(std::string str, const DATATYPE dt){ 
    static std::map<DATATYPE, std::string> map; 
    if (map.size() == 0){ 
    #define INSERT_ELEMENT(e) map[e] = #e 
      INSERT_ELEMENT(NODATATYPE);  
      INSERT_ELEMENT(DATATYPEINT);  
      INSERT_ELEMENT(DATATYPEVARCHAR);  
    #undef INSERT_ELEMENT 
    } 
    return str + map[dt]; 
} 

DATATYPE dt1 = DATATYPEINT; 
std::string msg = "illegal type for operation" + dt1; 

는이 코드를 컴파일 다음과 같은 경고를 받고 있어요.

경고 : ISO C++에서는 첫 번째 코드에 대한 최악의 변환이 두 번째 코드의 최악의 변환보다 낫지 만 모호합니다. std :: string msg = "잘못된 연산 유형"+ dt1; absch.cpp : 642 : 55 : 참고 : 후보 1 : 연산자 + (const char *, long int) file.cpp에서 포함 된 파일 : 4 : 0 : file.h : 18 : 20 : 참고 : 후보 2 : std : : 문자열 연산자 + (std :: string, DATATYPE) 인라인 std :: string 연산자 + (std :: string str, const DATATYPE dt) {

이 경고는 무엇을 의미하며 어떻게 해결해야합니까?

+0

DATATYPE에서

std::string msg = std::string("illegal type for operation") + dt1; 

또는 더 좋은 호출되어야 하는지를 컴파일러는 구별 할 수없는,이 의미하는 int 타입이다. C++ 11에서 enum 클래스를 사용할 수 있습니다. – UldisK

+0

오류가 발생하지 않습니다 http://ideone.com/Xsggwz – Ankur

+0

맵을 사용하는 대신 여기에 설명 된대로 열거 형 및 'to_string'함수와 함께 사용하는 정적 보조 구조를 권장합니다. http://stackoverflow.com/ 질문/9150538/how-do-i-tostring-an-enum-in-c/9150607 # 9150607 – pmr

답변

2

교환 원에게 전달하는 내용은 const char* (문자열 리터럴로)과 DATATYPE입니다. 과부하가 없기 때문에 컴파일러는 매개 변수가 암시 적으로 변환 될 수있는 오버로드를 찾습니다. 후보 경고에 :

operator+(const char*, long int) 
operator+(std::string, DATATYPE) 

첫번째 파라미터 std::stringconst char*로부터 변환 될 수 있거나 두번째 파라미터 DATATYPE에서 long int로 전환시킬 수있다. 따라서 첫 번째 오버로드는 첫 번째 매개 변수를 기준으로 과부하 해결을 "이기고"두 번째 오버로드는 두 번째 인수를 기반으로 "이깁니다". 두 인수에 근거하여 해상도를 "초과"하는 과부하가 없기 때문에 모호합니다.

컴파일러는 사용자가 의도 한 것보다 다른 오버로드를 선택했기 때문에 경고합니다. gcc에서 -pedantic으로 컴파일하면 경고 대신 error: ambiguous overload for이 표시됩니다.

해결 방법은 정확히 일치하는 유형의 매개 변수를 전달하여 호출의 모호성을 제거하는 것입니다. 간단한 방법은 다음과 같습니다 C++ 14

std::string msg = "illegal type for operation"s + dt1; 
관련 문제