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在它们前面添加 a 来指定它。试试这个:

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但将 a 传递给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);

但是这种行有一些错误。其中一个参数是错误的。所以你得到了错误。您发布的代码是可以的。

于 2011-07-19T20:41:21.393 回答