【问题标题】:Map function in C++ with templates使用模板在 C++ 中映射函数
【发布时间】:2011-05-17 09:58:59
【问题描述】:

我正在尝试学习 C++ 中的模板,而我尝试的其中一件事是编写一个 map 函数,就像你通常在函数式语言中找到的那样。这个想法是这样的:

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) 还有错误吗?

【问题讨论】:

  • 你知道这个函数已经存在于标准库中了吧? (称为std::transform
  • 哦,是的,我只是想学习如何做到这一点。
  • 您没有为新创建的数组分配任何内存。
  • 您还可以通过将类型更改为template &lt;class X, class Y&gt; Y * myMap(Y (*func)(X), X * array, int size) 甚至template &lt;class X, class Y, class F&gt; Y * myMap(F func, X * array, int size) 来使您的函数更通用。
  • 最后一个版本看起来很漂亮!

标签: c++ templates map


【解决方案1】:

您没有调用模板化的 MyMap 函数,而是重新尝试调用非模板化的 MyMap 函数。试试 q= MyMap(.....)

【讨论】:

    【解决方案2】:

    X * func(X) 没有说出你认为的那样。你想要X (*func)(X)

    【讨论】:

    • 哎呀...该死的。我知道这一定很愚蠢。但是现在我遇到了段错误。 :(
    • 刚刚发现我忘记分配临时变量了;
    【解决方案3】:

    你们很亲密。只是缺少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;
    }
    

    【讨论】:

    • 我不知道在调用函数时我必须注释类型。那有必要吗?另外,我从这段代码中得到了一个段错误。只是想我忘了分配临时变量;
    • @Rafael:不,我认为您需要注释类型。编译器应该能够推断出它。我会编辑我的帖子。
    【解决方案4】:

    您只是在这里弄错了函数指针的语法。你想说:

    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)
    {
       ...
    }
    

    【讨论】:

    • 我无法编译第二个版本。可以举个例子吗?
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多