为什么这样的功能
typedef std::vector<someclass> infocontainer;
double function2(const infocontainer&);
void function1(std::ostream&, const std::string&, double function2(const infocontainer&), const infocontainer, const infocontainer);
在主要运行时调用
function1(std::cout, "astring", function2, did, didnt);
但是当function2有第二个参数时会产生错误。
double function2(const infocontainer&, std::string&);
void function1(std::ostream&, const std::string&, double function2(const infocontainer&, const std::string&), const infocontainer, const infocontainer);
主
function1(std::cout, "astring", function2, did, didnt);
candidate function not viable: no known conversion from 'double (const infocontainer &, const
std::string &)' to 'double (*)(const infocontainer &, std::string &)' for 3rd argument
答案 0 :(得分:3)
“没有已知的转换”
double (const infocontainer &, const std::string &)
“到”
double (*)(const infocontainer &, std::string &)
区别在于const
到第二个参数。您可能认为该函数定义为double function2(const infocontainer&, const std::string&);
,但您的编译器不同意。
答案 1 :(得分:1)
typedef
是你的朋友,有功能指针
typedef
将减少许多问题,尤其是在为函数指定参数时。
typedef double (*Pointer_To_One_Argument_Function)(const infocontainer&);
typedef double (*Pointer_To_Two_Argument_Function)(const infocontainer&, std::string&);
void function1A(std::ostream&, const std::string&, Pointer_To_One_Argument_Function, const infocontainer, const infocontainer);
void function1B(std::ostream&, const std::string&, Pointer_To_Two_Argument_Function, const infocontainer, const infocontainer);
在上面的例子中,typedef
可以使声明更具可读性
此外,如果您选择更改函数指针的参数的数量或类型,则更改参数的类型会更容易。
至于你的问题,请检查两个参数函数指针示例中函数指针的语法。
C ++语言不是将复杂或复杂的语法用于函数指针,而是提供了另一种选择:函数对象
函数对象是具有class
的{{1}}或struct
示例:强>
overloaded operator()
要使用此模式,请声明从struct Function_Object_One_Parameter
{
virtual double operator()(const infocontainer&) = 0;
};
struct Function_Object_Two_Parameter
{
virtual double operator()(const infocontainer&, std::string&) = 0;
};
void function1C(std::ostream&, const std::string&, Function_Object_One_Parameter& f1, const infocontainer ic, const infocontainer)
{
// ...
f1(ic);
// ...
}
void function1D(std::ostream&, const std::string& s, Function_Object_Two_Parameter& f2, const infocontainer ic, const infocontainer)
{
// ...
f2(ic, s);
// ...
}
或Function_Object_One_Parameter
派生的函数:
Function_Object_Two_Parameter
答案 2 :(得分:1)
因为您发布的代码与您尝试编译的代码不同。
以下一行
void function1(std::ostream&, const std::string&, double function2(const infocontainer&, const std::string&), const infocontainer, const infocontainer);
在您尝试编译的代码的第三个参数中缺少const
之前的std::string &
。