C++ C2664无法将参数从';初始值设定项列表';

C++ C2664无法将参数从';初始值设定项列表';,c++,arrays,visual-studio,templates,pointers,C++,Arrays,Visual Studio,Templates,Pointers,我在Visual Studio 2017上运行以下代码。这段代码是一个在数组上实现线性搜索的简单练习 之所以使用该模板,是因为该函数将用于任何类型的数组、char数组、int数组等 #include "stdafx.h" #include <iostream> #include <vector> template <typename T> int linearSearch(T* arr, int size, T varToSearch) { for

我在Visual Studio 2017上运行以下代码。这段代码是一个在数组上实现线性搜索的简单练习

之所以使用该模板,是因为该函数将用于任何类型的数组、char数组、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;
}
对我来说什么应该正常工作

编辑

阅读评论并思考答案后,如果你也被困在这个问题上,就会发生这种情况。假设函数中有以下语法:

 void exampleFunction(char *text){ \\whatever}
使用该函数时,您会传递以下信息:

 exampleFunction({'a', 'b', 'c'}){ \\whatever}
如果您希望{'a'、'b'、'c'}衰减为指针,以便可以使用文本[]进行迭代,它不会。使用此语法,您将得到一个std::initializer\u列表,而不是一个数组

您可以执行以下操作:

int linearSearch(char* arr, int size, char varToSearch)
 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;
}
模板
int linearSearch(标准::向量列表,T varToSearch){
对于(typename std::vector::iterator it=list.begin();it!=list.end();it++){
if(varToSearch==*it)返回(it-list.begin());
}
返回-1;
}

因为您不能用这种方式创建数组。这个东西{'a','b','c','d}称为初始值设定项列表,但它不支持运算符重载。因此,您有两个解决方案: 在调用函数之前,首先创建数组。 或者您可以将函数声明更改为接受std::vector by value,并向它们发送初始值设定项列表,这样应该可以工作。
很抱歉,我的英语不好。

因为你不能用这种方式创建数组。这个东西{'a','b','c','d}称为初始值设定项列表,但它不支持运算符重载。因此,您有两个解决方案: 在调用函数之前,首先创建数组。 或者您可以将函数声明更改为接受std::vector by value,并向它们发送初始值设定项列表,这样应该可以工作。
对不起,我的英语不好。

正如其他人提到的,你不能那样做。您可以使用向量,但出于某种原因,如果您不能使用,您可以尝试使用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;
}
#包括
#包括
模板
int-linearSearch(标准::数组和arr,T变量搜索)
{
int i=0;
for(auto&element:arr)//遍历每个元素
{
if(element==varToSearch)
返回i;
++一,;
}
返回-1;
}
int main()
{
数组arr1={'a','b','c','d'};

std::cout正如其他人提到的,您不能这样做。您可以使用向量,但出于某种原因,如果您不能,您可以尝试使用c数组,或者使用更好的替代std::数组

#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;
}
#包括
#包括
模板
int-linearSearch(标准::数组和arr,T变量搜索)
{
int i=0;
for(auto&element:arr)//遍历每个元素
{
if(element==varToSearch)
返回i;
++一,;
}
返回-1;
}
int main()
{
数组arr1={'a','b','c','d'};

std::cout No,大括号初始化列表不会衰减为指针。你凭什么相信它会衰减?这是一个,它不会衰减为指针。为什么不呢?对我来说,arr将保留传递给函数的数组在内存中的第一个位置。这会很好。这会很方便。不幸的是,它不是这样工作的。我不知道为什么,我最好的朋友ss是没有人能想出一个好的方法使它工作并且在各种各样的情况下都是防弹的。@ForceBru对我来说初始化列表是用来初始化类的成员的。为什么这是一个初始化列表?不,括号初始化列表不会衰减为指针。你怎么相信它会呢?这是一个,而且它不会衰减为指针。为什么不呢?对我来说,arr将保持传递给函数的数组在内存中的第一个位置。这会很好。这会很方便。不幸的是,它不是这样工作的。我不知道为什么,我最好的猜测是,没有人能想出一个好方法使它工作,并在各种CA中防弹它将在其中使用。@ForceBru For me初始值设定项列表用于初始化类的成员。为什么这是一个初始值设定项列表?