如果标题不够具有描述性,我很抱歉,我不知道这有什么问题:
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*&)
答案 0 :(得分:1)
它不能推导出S
和P
的模板参数,但是因为你明确地使用参数调用方法,所以你正在跳过演绎,因此编译器只是告诉你它无法找到特定的比赛。
它找不到它的最可能的原因是因为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);
但是这种线路有一些错误。其中一个参数是错误的。所以你得到了错误。您发布的代码没问题。