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

时间:2011-04-20 15:44:42

标签: c++ templates

我收到此错误和另一个错误**“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);

}

2 个答案:

答案 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::vectorstd::arraystd::deque

答案 1 :(得分:0)

从快速浏览一下,突然发现的两件事是:

  1. 您在模板功能中以不同的方式使用T.你正在返回一个T对象,并将一个T对象的引用作为一个参数 - 但是当你使用它时,你传递一个int数组作为参数,但只是期望返回一个int
  2. 您不会使用任何模板调用您的模板功能(例如,myMax<int>(...)编辑 - 正如Mark B指出的那样,这不是必需的