从迭代器获取的带有指针参数的C ++模板函数会产生错误

时间:2011-07-19 19:12:06

标签: c++ pointers boost-iterators template-function

如果标题不够具有描述性,我很抱歉,我不知道这有什么问题:

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

2 个答案:

答案 0 :(得分: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)传递。尽量避免混淆或误导这样的代码。

我假设你没有写这个,因为你没有具体的问题,所以这也可能属于不使用你不理解的东西。可能还有其他问题尚未被发现,您可能最好还是回到绘图板并想出一个可以维护的设计。

答案 1 :(得分:0)

好的,这是您的代码示例的错误:

某处(问题中没有描述),你有函数的实际声明,它有一个错误。它看起来像这样:

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

但是这种线路有一些错误。其中一个参数是错误的。所以你得到了错误。您发布的代码没问题。