Написал шаблон функции, описал функцию, но компилятор выдает мне такую ошибку:
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);
}
В чем заключается ошибка?
Передать в шаблонную функци массив можно двумя способами:
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);
}
В принципе можно передавать массив как просто указатель и потом кастовать к типу массива или двойному указателю, но не думаю что это то что Вам нужно, да и, как по мне, не очень это правильно.
Ну вот например,
T firstNeg(T array, T dim2, T curDim)
пусть T
- int
. Т.е. array
- просто число. И что должно собой представлять array[i]
? :)
Но это к самой функции. Вот вы ей передаете firstNeg(array, 2, 0);
Но ведь у вас по шаблону судя, типы array
, 2 и 0 должны быть одинаковы. Но разве ваш array
- это int
?
Всё понятно? или разжевывать дальше?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно сделать снимок экрана и записать его RGB-данные в буфер (BYTE*, unsigned char*, string - не важно)Не нужно сохранять файл, не нужны BMP-заголовки - просто...
Есть таблица ForgeRock, которая содержит поле nameВ поле ForgeRock
Добрый деньНесколько разработчиков используют GIT в работе с сайтом, который сделан на WordPress
Как написать функцию проверки isGameOver() 5ти одинаковых символов подряд? Те