Шаблонная функция C++ с аргументом указателя, взятым из итератора, выдает ошибку
Извините, если название не было достаточно описательным, я понятия не имею, что не так с этим:
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 ответа
Он не может вывести аргумент шаблона для 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)
, Старайтесь не вводить в заблуждение или вводить в заблуждение подобный код.
Я предполагаю, что вы не написали это, потому что у вас нет конкретного вопроса, поэтому он также может попасть под сомнение, не используйте то, что вы не понимаете. Вероятно, есть и другие проблемы, которые еще не были обнаружены, и вам лучше вернуться к чертежной доске и придумать дизайн, который будет удобен для вас.
Хорошо, вот что не так с вашими примерами кода:
где-то (не описано в вопросе), у вас есть фактическое объявление функции, и она имеет ошибку. Это выглядит так:
template<class S, class P>
P* findPolicy(boost::ptr_vector<P> &policies,S *state);
Но в такой линии есть какая-то ошибка. Один из параметров неверен. Итак, вы получите ошибку. Код, который вы разместили, в порядке.