C2664 无法从'initializer list'转换参数

C2664 cannot convert argument from 'initializer list'

本文关键字:list 转换 参数 initializer C2664      更新时间:2023-10-16

我有以下代码,我在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;
}

我得到标题的错误,经过长时间的搜索,我没有找到问题。

此处有关错误的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'} 衰减为指针,以便您可以使用 text[] 进行迭代,则不会。使用此语法,您将获得一个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;
}

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

正如其他人提到的,你不能这样做。 您可以使用向量,但出于某种原因,如果您不能,您可以尝试 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;
}