我收到此错误和另一个错误**"智能感知:没有函数模板的实例匹配参数列表"**编译以下代码时
我知道我的函数可能存在逻辑错误,但我需要首先解决此错误才能调试我的函数.
#include <iostream>
using namespace std;
template<class T>
T myMax (T& arr ,int arrStart ,int arrSize)
{
if(arrStart==arrSize-1)
return arr[arrSize];
int median = (arrStart+arrSize)/2 ;
T left , right , maximum ;
left = max(arr,arrStart , median);
right = max(arr , median+1 , arrSize-1) ;
if (left>right)
maximum = left;
else
maximum = right ;
return maximum ;
}
void main()
{
int arrSize = 5;
int arr[] = {1,3,4,6,22};
int x;
x = myMax(arr,0,arrSize);
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 10
参数的参数arr
是类型int[5]
.由于您没有为T
调用时指定模板参数myMax
,因此会发生参数推断并T
推断为int[5]
.
那么编译器试图用专门的函数模板T = int[5]
(即,它会尝试替换的所有实例T
用int[5]
).这会失败,因为函数返回一个T
by值,但不能按值返回一个数组(如int[5]
).
看起来你想T
成为元素类型.如果是这种情况,您可以显式地获取对数组的引用,例如,
template<class T, unsigned N>
T myMax (T (&arr)[N])
Run Code Online (Sandbox Code Playgroud)
但是,编写函数的更惯用的方法是使用一对随机访问迭代器并让它返回指向"max"元素的迭代器:
template <typename RandomAccessIt>
RandomAccessIt myMax (RandomAccessIt first, RandomAccessIt last)
Run Code Online (Sandbox Code Playgroud)
first
是范围中第一个元素last
的迭代器,并且是范围的一个结尾的迭代器,对于STL算法来说是惯用的.指针可用作随机访问迭代器,因此可以将此函数称为
int* pointerToMaxElement = myMax(arr, arr + arrSize);
Run Code Online (Sandbox Code Playgroud)
迭代方法的优点是,它适用于任何随机存取的范围,包括阵列,std::vector
,std::array
,和std::deque
.