Функция карты в C ++ с шаблонами - PullRequest
3 голосов
/ 29 ноября 2010

Я пытаюсь изучить шаблоны на C ++, и одна из вещей, которые я пробовал, заключалась в кодировании функции карты, подобной тем, которые вы обычно найдете в функциональных языках.Идея была примерно такой:

template <class X> X * myMap(X * func(X), X * array, int size)
    {
      X * temp;
      for(int i = 0, i < size, i++) {temp[i] = (*func)(array[i]);}
      return temp;
    }

Но когда я пытаюсь использовать это в:

int test(int k) { return 2 * k;}
int main(void)
{
   int k[5] = {1,2,3,4,5};
   int *q = new int[5];
   q = myMap(&test, k, 5);
   for(int i=0; i<5; i++) {cout << q[i];}
   delete [] q;
   return 0;
}

Я получаю ошибку несоответствия типов при компиляции:

 main.cpp:25: error: no matching function for call to ‘myMap(int (*)(int), int [5], int)’

Я пытался изменить его на:

int main(void)
{
   int *k = new int[5];
   int *q = new int[5];
   for(int i=0; i<5;i++) {k[i] = i;}
   q = myMap(&test, k, 5);
   for(int i=0; i<5; i++) {cout << q[i];}
   delete [] q;
   return 0;
}

Сообщение об ошибке меняется на:

 main.cpp:26: error: no matching function for call to ‘myMap(int (*)(int), int*&, int)’

Это, вероятно, что-то очень неправильно, но я не могу найти где.

РЕДАКТИРОВАТЬ: ошибки, где: 1) я неправильно набрал указатель на функцию.Это X (* func) (X) вместо X * func (X).2) забыл выделить темп.Должен сделать X * temp = new X[size].3) есть ли еще ошибки?

Ответы [ 4 ]

5 голосов
/ 29 ноября 2010

X * func(X) не говорит то, что вы думаете, говорит. Вы хотите X (*func)(X).

1 голос
/ 29 ноября 2010

Вы просто неправильно получаете синтаксис для указателя на функцию. Вы хотите сказать:

template <class X> 
X* myMap(X (* func)(X), X * array, int size)
{
    ...
}

Чтобы сделать эту функцию более общей, используйте параметр шаблона вместо указателя функции, чтобы вы могли использовать как простые указатели функций , так и объекты функций C ++ (функторы).

template <class X, class F> 
X* myMap(F func, X * array, int size)
{
   ...
}
1 голос
/ 29 ноября 2010

Вы были очень близки.Просто пропускает параны вокруг X(*func)(X).Пара других синтаксических ошибок, исправленных здесь:

#include <iostream>
using namespace std;


template <class X> X * myMap(X(*func)(X), X * array, int size)
    {
      X * temp;
      for(int i = 0; i < size; i++) {temp[i] = (*func)(array[i]);}
      return temp;
    }

int test(int k) { return 2 * k;}
int main(void)
{
   int k[5] = {1,2,3,4,5};
   int *q = new int[5];
   q = myMap(&test, k, 5);
   for(int i=0; i<5; i++) {cout << q[i];}
   delete [] q;
   return 0;
}
0 голосов
/ 29 ноября 2010

Вы не вызываете свою шаблонную функцию MyMap, вы пытаетесь вызвать не шаблонную функцию MyMap.Попробуйте q = MyMap (.....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...