0

为什么会有这样的功能

typedef std::vector<someclass> infocontainer;

double function2(const infocontainer&);

void function1(std::ostream&, const std::string&, double function2(const infocontainer&), const infocontainer, const infocontainer);

在 main 调用时运行良好

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
4

3 回答 3

3

“没有已知的转换”

double (const infocontainer &, const  std::string &)

“至”

double (*)(const infocontainer &, std::string &)

区别在于const第二个论点。您可能认为该函数定义为double function2(const infocontainer&, const std::string&);但您的编译器不同意。

于 2013-10-23T23:24:25.690 回答
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++ 语言没有对函数指针使用复杂或复杂的语法,而是提供了另一种选择:函数对象。
函数对象是 aclassstruct具有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_Parameteror派生的函数Function_Object_Two_Parameter

struct Happy_Function_One
: public Function_Object_One_Parameter
{
  double  operator()(const infocontainer&)
  {
    std::cout << "Happy" << std::endl;
    return 3.14159267;
  }
}
于 2013-10-23T23:23:08.270 回答
1

因为您发布的代码与您尝试编译的代码不同。

以下行

void function1(std::ostream&, const std::string&, double function2(const infocontainer&, const std::string&), const infocontainer, const infocontainer);

在您尝试编译的代码的第三个参数中缺少一个constbefore 。std::string &

于 2013-10-23T23:23:29.587 回答