2011-11-28 145 views
1

我有指定的模板函數:C++模板函數 - 編譯器錯誤:「無法從爲const char *更改爲int」

template<class T> void jsonParse(json_object* jobj, eParseWhat parseWhat, T &value) { 
    ... 

    if(parseWhat == PARSE_UID) { 
     value = json_object_getInt(val); 
    } 
    if(parseWhar == PARSE_EMAIL) { 
     value = json_object_getString(val); 
    } 
    ... 
} 

現在,當我想解析JSON對象的uid我調用該方法與int

json_object* obj = ...; 
int uid = 0; 
jsonParse(obj,PARSE_UID,uid); 

但隨後在轉讓在管線發生編譯錯誤:

value = json_object_getString(val); 

由於用int進行調用,編譯器認爲變量value的類型是intjson_object_getString(val)返回的是const char*。所以編譯器說: can not convert from const char* to int

你有什麼建議可以解決這個問題嗎?

+1

價值如何定義?它是參數列表中的T&value嗎? –

回答

1

爲什麼你甚至要使用模板,如果你打算爲每種類型的一堆if語句做一個switch語句?如果要將每種類型都視爲多種類型,則您的模板實例化將永遠不會編譯。這種設計是有缺陷的,但如果你必須這樣做,那麼你可以使用專業化來完成類似的事情。

template<class T> void jsonParse(json_object* jobj, eParseWhat parseWhat, T &value) { 
    static_assert(false); // not a handled type 
} 

template<> void jsonParse(json_object* jobj, eParseWhat parseWhat, int &value) { 
    value = json_object_getInt(val); 
} 

template<> void jsonParse(json_object* jobj, eParseWhat parseWhat, std::string &value) { 
    value = json_object_getString(val); 
} 

正如GMan指出的那樣,通常最好是重載函數而不是專用函數模板。使用重載函數等效將是這樣的:

void jsonParse(json_object* jobj, eParseWhat parseWhat, int &value) { 
     value = json_object_getInt(val); 
    } 

void jsonParse(json_object* jobj, eParseWhat parseWhat, std::string &value) { 
     value = json_object_getString(val); 
    } 
+2

然後,更好地使用重載。 – GManNickG

+0

更正GMan模板似乎完全沒有必要。 – AJG85

+0

感謝您的快速回答傢伙! 我認識到在這種情況下使用模板不是一個好的解決方案......我想我會用不同的類型重載函數......我會看看boost:any;) –

0

你沒打算寫:

if(parseWhat == PARSE_UID) { 
     value = json_object_getInt(val); 
    } 
    else if(parseWhar == PARSE_EMAIL) { 
     value = json_object_getString(val); 
    } 

在一個旁註:在您的示例模板的使用是很奇怪和困惑了我。我寧願爲此使用某種類型的Variant(一個示例是boost::any,但您可以輕鬆實現自己的 - 這是一個兩小時的問題)。

+0

'boost :: any'不是變體類,'boost :: variant'是。 – GManNickG

+0

@GMan:我沒有使用它,但描述表明它是一個變體類 –

+1

Boost.Any提供了一個動態變體,Boost.Variant提供了一個靜態變體。隨着代碼的使用方式,我會同意@GMan在這裏提供一個靜態變體。 – ildjarn

0

您的代碼將不會以任何方式進行編譯,原因在於方法t值不能在同一時間INT與char * ...

您嘗試施放不同的充類型(一個是INT上是一個char)的值(甚至不是定義);)

首先,你必須使用:

json_object* obj = ...; 
int uid = 0; 

jsonParse<int>(obj,PARSE_UID,uid); //last parameter is int 

jsonParse<string>(obj,PARSE_UID,whatever); //last parameter is string 

但是,這並不工作,因爲之前說的......兩種不同勢方式一個模板,你不能用一個類型...

對不起... :)

+0

是的,很好的回答JG85! – DirkMausF

+0

我認爲這是可能的;) –

相關問題