2012-06-03 95 views
0
/* Find an item in an array-like object 
* @param val the val to search for 
* @param arr an array-like object in which to search for the given value 
* @param size the size of the array-like object 
* @return the index of the val in the array if successful, -1 otherwise 
*/ 
template < class T> 
int mybsearch(T val, T const arr[], const int &size) 

當我嘗試調用使用const char *與字符串數組這個模板函數,編譯器會抱怨... mybsearch("peaches", svals, slen),我怎麼能修改模板原型,以適應這一點?爲const char *作爲參數傳遞給模板

這裏是字符串數組

string svals[] = { "hello", "goodbye", "Apple", "pumpkin", "peaches" }; 
    const int slen = sizeof(svals)/sizeof(string); 
+0

編譯器抱怨什麼?請發佈錯誤消息。 –

+0

'svals'的類型是什麼? –

+0

而錯誤信息是...? – jpalecek

回答

0

(徹底改變答案的問題得到了擴展後)

的問題是,你搜索的值是一個const char *,但數組你搜索是std::string s的數組。 (嗯,我希望你有using std了代碼的地方,而且使用的是標準的字符串,而不是你自己的。)

您需要調用它像這樣:

mybsearch(字符串(「桃子」 ),svals

+0

現在呢?看來編譯器抱怨const char *與字符串類型不匹配 – jctank

+2

這是錯誤的;在C++中沒有常量引用類型,當放置在類型中間時,「const」適用於左邊的東西。 – jpalecek

+0

@jpalecek糟糕,你是對的,我把它與'char&const'混合在一起。將編輯或刪除。謝謝。 –

2

因爲T推導爲const char*,SLEN),你想用string[]初始化const char* const[]。這不會奏效(如果參數類型基本相同,則數組只能傳遞給函數 - 保存限定符 - 作爲參數類型)。

您可以

  • 使用C字符串一致,例如:

    const char* svals[] = { "hello", "goodbye", "Apple", "pumpkin", "peaches" }; 
    

    建議。

  • 使用C++字符串一致

    mybsearch(string("peaches"), svals, slen) 
    
  • 解耦參數mybsearch(這樣你就可以搜索的類型與數組類型不同的元素,只要他們可比)

    template < class T, class U> 
    int mybsearch(T val, U const arr[], const int &size) 
    
+0

還有第四種選擇:在通話時將'T'的類型明確地指定爲'string':'mybsearch (「peaches」,svals,slen)''。編譯器會使用適當的構造函數將''peaches''自動轉換爲'string'。但是請注意,將'T'指定爲'const char *'將不起作用,因爲沒有從'string'到'const char *'的隱式轉換,更不用說字符串數組了。 –

+0

我試圖通過傳遞數組作爲參考來解耦參數,如'U&arr'。我也嘗試將arr中的項目類型轉換爲類似於'T temp =(T)arr [0]'的T類型,現在我正在嘗試將'const char *'轉換爲字符串。 – jctank

相關問題