No matching function for call to [требует правки]

389
14 февраля 2017, 19:20

Написал шаблон функции, описал функцию, но компилятор выдает мне такую ошибку:

error: no matching function for call to ‘firstNeg(int [2][2], int, int)’

Вот код:

#include <stdio.h>
template<class T> T firstNeg(T array, T dim2, T curDim) {
    for (int i = curDim; array[i]; i += dim2) {
        if (array[i] < 0)
            return array[i];
    }
    return 0;
}
int firstNeg(int* array, int dim2, int curDim);
/*int firstNeg(int* array, int dim2, int curDim) {
    for (int i = curDim; array[i]; i += dim2) {
        if (array[i] < 0)
            return array[i];
    }
    return 0;
}*/
main() {
    int dim2 = 2;
    int array[2][2] = { {1, 2}, {-1, -2} };
    // вызов функции с указателем
    int i = firstNeg(array, 2, 0);
    printf("%i \n", i);
}

В чем заключается ошибка?

Answer 1

Передать в шаблонную функци массив можно двумя способами:

1) Передача по ссылке:

template<class T, std::size_t s1, std::size_t s2>
void func(T(& name)[s1][s2])
{
    std::cout << "Array by reference" << std::endl;
    std::cout << s1 << " " << s2 << std::endl;
    std::cout << name[0][0] << " " << name[s1 - 1][s2 - 1] << std::endl;
}
int main()
{
    int mas[2][3] = { {0, 1, 2}, {3, 4, 5} };
    func(mas);
}

2) Передача по указателю:

template<class T, std::size_t s1, std::size_t s2>
void func2(T(*name)[s1][s2])
{
    std::cout << "Array by pointer" << std::endl;
    std::cout << s1 << " " << s2 << std::endl;
    std::cout << (*name)[0][0] << " " << (*name)[s1 - 1][s2 - 1] << std::endl;
}
int main()
{
    int mas[2][3] = { {0, 1, 2}, {3, 4, 5} };
    func2(&mas);
}

В принципе можно передавать массив как просто указатель и потом кастовать к типу массива или двойному указателю, но не думаю что это то что Вам нужно, да и, как по мне, не очень это правильно.

Answer 2

Ну вот например,

T firstNeg(T array, T dim2, T curDim)

пусть T - int. Т.е. array - просто число. И что должно собой представлять array[i]? :)

Но это к самой функции. Вот вы ей передаете firstNeg(array, 2, 0);

Но ведь у вас по шаблону судя, типы array, 2 и 0 должны быть одинаковы. Но разве ваш array - это int?

Всё понятно? или разжевывать дальше?

READ ALSO
Как сделать снимок экрана в буфер на C++?

Как сделать снимок экрана в буфер на C++?

Нужно сделать снимок экрана и записать его RGB-данные в буфер (BYTE*, unsigned char*, string - не важно)Не нужно сохранять файл, не нужны BMP-заголовки - просто...

343
Заменить подстроки из таблицы

Заменить подстроки из таблицы

Есть таблица ForgeRock, которая содержит поле nameВ поле ForgeRock

368
Wordpress + GIT + MySQL

Wordpress + GIT + MySQL

Добрый деньНесколько разработчиков используют GIT в работе с сайтом, который сделан на WordPress

274
Крестики-нолики 10 на 10

Крестики-нолики 10 на 10

Как написать функцию проверки isGameOver() 5ти одинаковых символов подряд? Те

377