2016-01-07 2 views
0

Я пытаюсь сделать двоичный шаблон поиска, когда я запускаю его с помощью примитива «int», код работает нормально, но когда я запускаю его с помощью «string» I получить ошибку«Нет соответствующей функции вызова ...» для функции шаблона

«нет вызова функции согласования с binary_search_template»

Почему это работает с Интс, но не строками?

Вот код

main{ 
std::vector<string> e; 
    e.push_back("a"); 
    e.push_back("b"); 
    e.push_back("c"); 

int index = binary_search_template(e, 0, d.size()-1.0, "a"); //error for strings but not ints 

} 

заголовочный файл

template<typename T> 
int binary_search_template(std::vector<T>& a, int from, int to, T value); 

template<typename T> 
int binary_search_template(std::vector<T>& a, int from, int to, T value) 
{ 
    if (from > to) { 
     return -1; 
    } 
    int mid = (to + from)/2; 

    if (a[mid] == value) { 
     return mid; 
    }else if (a[mid] < value) { 
     return binary_search_template(a, mid+1, to, value); 
    }else { 
     return binary_search_template(a, from, mid, value); 
    } 
} 
+0

Как насчет 'return binary_search_template (a, mid + 1, to, value);' –

+0

В этой строке кода ошибка не отображается, только когда я вызываю ее из main и использую строку, но для ints она кажется work fine – user2076774

+1

Я думаю, что это потому, что он не может вывести аргумент шаблона T как std :: string из значения «a». Вероятно, он выводит 'const char *' и путается. Таким образом, вы можете явно указать параметр шаблона или использовать 'std :: string ('a')' в качестве окончательного аргумента. –

ответ

3

Компилятор видит два кандидата типа T при использовании std::vector<std::string> и строковый литерал:

  1. std::string
  2. char const*

Вам нужно сделать до вас ума, например, путем передачи аргумента в std::string("a"). В качестве альтернативы вы можете использовать дополнительный параметр шаблона для последнего аргумента.

Смежные вопросы