1

タイトルが十分に説明的でなかった場合は申し訳ありませんが、これの何が問題なのかわかりません。

  template <class S, class P> 
  P* findPolicy(boost::ptr_vector<P> &policies,S *state)
  {
    typename boost::ptr_vector<P>::iterator it;
    for ( it = policies.begin(); it != policies.end(); ++it)
    {
      if ( *it->getState() == state)
      {
        return &(*it);
      }
    }
  }

次のメンバー関数内から上記の関数を呼び出すと、次のようになります。

template <class S> template <class P>
void Policy<S>::updateOptimal(boost::ptr_vector<P> &policies)
{
  S *curr_state = state;
  boost::ptr_vector<Action> actions = curr_state->getAllActions();
  P *best_pol;
  boost::ptr_vector<Action>::iterator iter;
  for (iter = actions.begin(); iter != actions.end(); ++iter)
  {
    if (iter->getNextState())
    {
      S *s = dynamic_cast<S *>(iter->getNextState());
      P *temp_pol = var::findPolicy<S,P>(policies,s);
      if (temp_pol->getValue() > best_pol->getValue())
      {
        opt_Action = &(*iter);
      }
    }
  }  
}

私はいつも得る: policy.hpp:237: error: no matching function for call to 'findPolicy(boost::ptr_vector<Greedy<guState>, boost::heap_clone_allocator, std::allocator<void*> >&, State*&)

4

2 に答える 2

1

のテンプレート引数を推測することはできませんが、引数を使用SPてメソッドを明示的に呼び出すため、推測をスキップしているため、コンパイラは、特定の一致が見つからないと単純に通知します。

見つからない可能性が最も高いのは、SまたはPのいずれかがテンプレートであり、実際のタイプではないためです。その場合typenameは、それらの前にを追加して指定する必要があります。代わりにこれを試してください:

P *temp_pol = var::findPolicy<typename S, typename P>(policies, s);

また、以下はおそらくタイプミスであることに注意してください。

template <class S> template <class P>
void Policy<S>::updateOptimal(boost::ptr_vector<P> &policies)

おそらく次のようになります。

template <class S, class P>
void Policy<S>::updateOptimal(boost::ptr_vector<P> &policies)

編集:P関数で指定している前のパラメーターの奇妙な使用にも気づきましたが、それに渡すと、テンプレート引数と関数パラメーターは、として渡したboost::ptr_vector<P>&ときと同じ順序ではないようです。このような混乱したり誤解を招くようなコードは避けてください。<S, P>(policies, s)

具体的な質問がないので書いていないと思いますので、わからないものは使わないでください。おそらくまだ発見されていない他の問題があり、設計図に戻って、自分にとって維持可能な機能を備えた設計を考え出す方がよい場合があります。

于 2011-07-19T20:52:34.360 に答える
0

わかりました。コード例の何が問題になっていますか。

どこか(質問には記載されていません)に、関数の実際の宣言があり、エラーがあります。次のようになります。

template<class S, class P>
P* findPolicy(boost::ptr_vector<P> &policies,S *state);

しかし、この種の行にはいくつかのエラーがあります。パラメータの1つが間違っています。したがって、エラーが発生します。あなたが投稿したコードは大丈夫です。

于 2011-07-19T20:41:21.393 に答える