C2664 не может преобразовать аргумент из 'списка инициализатора' - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующий код, который я запускаю в 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;
}

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

как уже упоминали другие, вы не можете этого сделать.Вы можете использовать векторы, но по какой-то причине, если не можете, вы можете попробовать использовать массивы c или, возможно, лучшую альтернативу std :: array.

#include <iostream>
#include <array>

template <typename T, size_t N>
int linearSearch(std::array<T, N> & arr, T varToSearch)
{
    int i = 0;
    for(auto& element : arr)//iterating through each element
    {
        if (element == varToSearch)
            return i;
        ++i;
    }

    return -1;
}

int main()
{
    std::array<char, 4> arr1 = {'a','b','c','d'};
    std::cout << linearSearch(arr1,'d') << std::endl;
    return 0;
}
0 голосов
/ 24 сентября 2018

Потому что вы не можете создать массив таким способом.Эта вещь {'a', 'b', 'c', 'd'} называется списком инициализаторов, но она не поддерживает перегрузку операторов.Итак, у вас есть 2 решения: сначала создайте массив, прежде чем вызывать функцию.Или вы можете изменить объявление функции, приняв std :: vector по значению, и отправить им список инициализаторов, это должно работать.И извините за мой английский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...