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);

メインで呼び出されたときは正常に実行されます

function1(std::cout, "astring", function2, did, didnt);

しかし、function2 に 2 番目の引数がある場合、エラーが発生します。

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 &)

違いは、const2 番目の引数にあります。関数は次のように定義されていると思うかもしれません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、宣言をより読みやすくすることができます。
また、関数ポインターのパラメーターの数または型を変更することを選択した場合、パラメーターの型を変更する方が簡単です。

あなたの質問については、2 パラメーター関数ポインターの例で関数ポインターの構文を調べてください。

代替: 関数オブジェクト (ファンクター)

関数ポインターに複雑な構文を使用する代わりに、C++ 言語は別の代替手段、つまり関数オブジェクトを提供します。
関数オブジェクトは、を持つclassまたはです。例:structoverloaded 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);

コンパイルしようとしているコードの 3 番目のパラメーターにconstbeforeがありません。std::string &

于 2013-10-23T23:23:29.587 に答える