У меня есть следующий код, который я запускаю в Visual Studio 2017. Этот код представляет собой простое упражнение для реализации линейного поиска в массиве.
Шаблон используется, потому что функция будет использоваться длялюбой тип массива, массив символов, массив int и т. д.
#include "stdafx.h"
#include <iostream>
#include <vector>
template <typename T>
int linearSearch(T* arr, int size, T varToSearch) {
for (int i = 0; i < size; i++) {
if (arr[i] == varToSearch) return i;
}
return -1;
}
int main()
{
std::cout << linearSearch({ 'a','b','c','d' }, 4, 'd') << std::endl;
return 0;
}
Я получаю ошибку заголовка, и после длительного поиска я не нашел проблему.
Страница Microsoftчто касается ошибки, здесь , не имеет соответствующей информации, чтобы понять, что происходит.
Для меня функция должна работать следующим образом: у меня есть имя типа T ,в основном это будет int или char.Скажем, это символ.
Когда я передаю {'a', 'b', 'c', 'd'} , он затухает в указатель и, , поскольку тип T является char , я бы имел следующее:
int linearSearch(char* arr, int size, char varToSearch)
Что для меня должно работать нормально.
РЕДАКТИРОВАТЬ
После прочтения комментариев и обдумывания ответов, это то, что происходит, если вы тоже застряли в этой проблеме.Допустим, у вас есть такой синтаксис в функции:
void exampleFunction(char *text){ \\whatever}
И при использовании функции вы передаете это:
exampleFunction({'a', 'b', 'c'}){ \\whatever}
Если вы ожидаете {'a', 'b','c'}, чтобы распасться на указатель, чтобы вы могли перебирать текст [], это не .С этим синтаксисом вы получите std :: initializer_list , а не массив .
Вы можете сделать следующее:
char arr[] = {'a', 'b', 'c'};
exampleFunction(arr){ \\whatever};
Таким образом, arr превратится в указатель .
Что касается проблемы в моем коде, я предпочел использовать std :: vector.
template <typename T>
int linearSearch(std::vector<T> list, T varToSearch) {
for (typename std::vector<T>::iterator it = list.begin(); it != list.end(); it++) {
if (varToSearch == *it) return (it - list.begin());
}
return -1;
}