21

在下面的代码示例中,调用foo有效,而调用bar失败。

如果我注释掉对 的调用bar,代码就会编译,这告诉我自己的定义bar很好。那么如何bar正确调用呢?

#include <iostream>

using namespace std;

int multiply(int x, int y)
{
    return x * y;
}

template <class F>
void foo(int x, int y, F f)
{
    cout << f(x, y) << endl;
}

template <class F>
void bar(int x, int y)
{
    cout << F(x, y) << endl;
}

int main()
{
    foo(3, 4, multiply); // works
    bar<multiply>(3, 4); // fails

    return 0;
}
4

2 回答 2

37

这里的问题是,multiply不是类型;它是一个,但函数模板bar期望模板参数是一个类型。因此错误。

如果将函数模板定义为:

template <int (*F)(int,int)> //now it'll accept multiply (i.e value)
void bar(int x, int y)
{
    cout << F(x, y) << endl;
}

那么它将起作用。见在线演示:http: //ideone.com/qJrAe

typedef您可以使用as来简化语法:

typedef int (*Fun)(int,int);

template <Fun F> //now it'll accept multiply (i.e value)
void bar(int x, int y)
{
    cout << F(x, y) << endl;
}
于 2012-06-03T14:25:40.907 回答
7

multiply不是类型,而是函数。在这种情况下,它会衰减为函数指针。但是,bar模板化的类型又multiply不是。

Nawaz 已经以相反的方式回答了这个问题(如何更改bar要与函数一起使用的定义),但是要回答您的明确问题,即如何按自己的方式调用bar,您需要一个合适的类型,如下所示:

struct Type {
  const int result;
  Type(int x, int y): result(x * y) {}
  operator int() const { return result; }
};

// usage
bar<Type>(x, y);

// (edit) a suitable type doesn't necessarily mean a new type; this works as well
// if you aren't trying to solve any specific problem
bar<std::string>(64, 64);
于 2012-06-03T14:28:22.033 回答