簡體   English   中英

C ++:將枚舉連接為std :: string

[英]C++: concatenate an enum to a std::string

所以我試圖將枚舉連接到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; absyn.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){

此警告究竟是什么意思,以及如何解決?

您傳遞給運算符的是const char* (表示字符串文字)和DATATYPE 由於沒有重載operator+(const char*, DATATYPE) ,編譯器會在可以隱式轉換參數的位置尋找重載。 候選人在警告中:

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

第一個參數可以從const char*轉換為std::string ,第二個參數可以從DATATYPE轉換為long int 因此,第一個重載在第一個參數的基礎上“獲勝”了過載解決方案,第二個重載在第二個參數的基礎上“獲勝”了。 由於在這兩個參數的基礎上都沒有過載“贏得”解決方案,因此它們是模棱兩可的。

編譯器警告您,因為它懷疑它選擇的重載可能不同於您要調用的重載。 如果在gcc上使用-pedantic進行編譯, -pedantic error: ambiguous overload for ...而不只是警告。

解決方案是通過傳遞完全匹配的類型的參數來消除呼叫的歧義。 一種簡單的方法是:

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

或在C ++ 14中更好

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM