const char *作为模板的参数

时间:2012-06-03 20:46:37

标签: c++ templates

/* 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),我怎么能修改模板原型来适应这个?

这是字符串数组

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

2 个答案:

答案 0 :(得分:2)

由于T被推断为const char*,因此您尝试使用const char* const[]初始化string[]。这不起作用(如果参数类型基本相同,则数组只能传递给函数 - 保存为限定符 - 作为参数类型)。

你可以

  • 一致地使用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)
    

答案 1 :(得分:0)

(问题扩展后完全改变了答案)

问题是您搜索的值是const char *,但您搜索的数组是std::string的数组。 (好吧,我希望你在代码的某处有using std,并且你使用的是标准字符串而不是你自己的字符串。)

您需要像这样调用它:

mybsearch(字符串(“桃子”),svals,slen)