[英]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.