错误C2893:无法专门化功能模板

Ahm*_*med 3 c++ templates

我收到此错误和另一个错误**"智能感知:没有函数模板的实例匹配参数列表"**编译以下代码时

我知道我的函数可能存在逻辑错误,但我需要首先解决此错误才能调试我的函数.

#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](即,它会尝试替换的所有实例Tint[5]).这会失败,因为函数返回一个Tby值,但不能按值返回一个数组(如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.