【发布时间】:2019-02-27 10:18:03
【问题描述】:
我在 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 页面 here 没有相关信息来了解正在发生的事情。
对我来说,函数应该这样工作:我有 typename 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;
}
【问题讨论】:
-
不,大括号初始化列表不会衰减为指针。是什么让你相信它会?
-
这是一个
initializer_list,它不会衰减为指针。 -
为什么不呢?对我来说 arr 将保持传递给函数的数组在内存中的第一个位置。
-
会很好。这会很方便。不幸的是,这不是它的工作方式。我不知道为什么,我最好的猜测是没有人能想出一种好的方法来让它工作并在各种使用它的情况下都防弹。..
-
@ForceBru 对于我来说,初始化列表用于初始化类的成员。这怎么是初始化列表?
标签: c++ arrays visual-studio templates pointers