1

我有一个功能

double function(const infocontainer&);

它作为参数传递给另一个函数。

void bigfunction(std::ostream& os, const std::string& s, double F(const infocontainer&), const infocontainer a, const infocontainer b)
{
    os << F(a) << F(b) << std::endl;
}

当我使用模板时,虽然我需要给 F 信息容器 a 和 b 的地址。为什么?

template <class F> void bigfunction(std::ostream& os, const std::string& s, F, const infocontainer a, const infocontainer b)
{
    os << F(&a) << F(&b) << std::endl;
}

这就是我调用函数的方式MAIN

bigfunction(std::cout, "name", function, cont_a, cont_b);
4

2 回答 2

1

您可能希望将(推导的)类型与参数的名称区分开来:

template <class F>
void bigfunction(std::ostream& os, const std::string& s, F& f, const infocontainer a, const infocontainer b)
{
    os << f(&a) << f(&b) << std::endl;
}
于 2013-11-04T17:50:27.557 回答
1

在您的模板定义F中是一个类型名称,而不是一个函数指针。因此,该F(x)符号将被编译器解释为尝试强制转换 x为 type F。它不是函数调用,而是 C++ 风格的强制转换。这与您尝试做的完全不同。这就是为什么您“必须”使用&aand&b作为参数的原因,因为编译器需要将指针参数转换为函数指针类型F。当然,这一切毫无意义。

你所要做的就是命名你的函数参数

template <class F> void bigfunction(std::ostream& os, const std::string& s, F f, 
                                    const infocontainer a, const infocontainer b)

(你为什么把名字放在第一位?)

然后在没有任何内容的情况下调用该函数&

os << f(a) << f(b) << std::endl;
于 2013-11-04T17:55:34.837 回答