我收到此错误和另一个错误**“IntelliSense:在编译以下代码时没有函数模板的实例与参数列表匹配”**
我知道我的函数可能存在逻辑错误,但我需要首先解决此错误才能调试我的函数。
#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);
}
答案 0 :(得分:9)
参数arr
的参数类型为int[5]
。由于您在调用T
时没有为myMax
指定模板参数,因此会发生参数推断,T
推断为int[5]
。
然后编译器尝试使用T = int[5]
专门化函数模板(即,它尝试用T
替换int[5]
的所有实例。这会失败,因为函数按值返回T
,但无法按值返回数组(如int[5]
)。
您希望T
成为元素类型。如果是这种情况,您可以明确地引用该数组,例如,
template<class T, unsigned N>
T myMax (T (&arr)[N])
尽管如此,编写函数的一种更惯用的方法是让它接受一对随机访问迭代器并让它返回一个指向“max”元素的迭代器:
template <typename RandomAccessIt>
RandomAccessIt myMax (RandomAccessIt first, RandomAccessIt last)
first
是范围中第一个元素的迭代器,last
是范围的一个结尾的迭代器,对于STL算法来说是惯用的。指针可用作随机访问迭代器,因此可以将此函数称为
int* pointerToMaxElement = myMax(arr, arr + arrSize);
迭代器方法的优点是它适用于任何随机访问范围,包括数组std::vector
,std::array
和std::deque
。
答案 1 :(得分:0)
从快速浏览一下,突然发现的两件事是:
myMax<int>(...)
)编辑 - 正如Mark B指出的那样,这不是必需的