ошибка C2893: не удалось специализировать шаблон функции - PullRequest
3 голосов
/ 20 апреля 2011

Я получаю эту ошибку и еще одну ошибку ** "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 ]

9 голосов
/ 20 апреля 2011

Аргумент для параметра 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, * 1029.* и std::deque.

0 голосов
/ 20 апреля 2011

На мой взгляд, две вещи, которые бросаются в глаза:

  1. Вы используете T по-разному в функции шаблона.Вы возвращаете объект T и берете ссылку на объект T в качестве аргумента - но когда вы используете его, вы передаете массив int в качестве аргумента, но ожидаете, что просто возвращенный int
  2. Youне вызывайте функцию шаблона с каким-либо шаблоном (например, myMax<int>(...)) Edit - как отмечает Марк B, это не требуется, однако
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...