Шаблонная функция 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);

Но в такой линии есть какая-то ошибка. Один из параметров неверен. Итак, вы получите ошибку. Код, который вы разместили, в порядке.

Другие вопросы по тегам