类模板可以是一个函数吗?

时间:2013-11-04 17:48:16

标签: c++

我有一个功能

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一个infocontainer 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);

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

在模板定义中F类型名称,而不是函数指针。因此,编译器会将F(x)符号解释为尝试强制转换 x以键入F。它不是一个函数调用,它是一个C ++风格的强制转换。这与您尝试的完全不同。这就是为什么你“必须”使用&a&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;