Шаблонная функция C ++ с аргументом указателя, взятым из итератора, выдает ошибку - PullRequest
1 голос
/ 19 июля 2011

Извините, если заголовок был недостаточно описательным, я понятия не имею, что с этим не так:

  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 ]

1 голос
/ 20 июля 2011

Он не может вывести аргумент шаблона для 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). Старайтесь не вводить в заблуждение или вводить в заблуждение подобный код.

Я предполагаю, что вы не написали это, потому что у вас нет конкретного вопроса, поэтому он также может попасть под сомнение, не используйте то, что вы не понимаете. Вероятно, есть и другие проблемы, которые еще не были обнаружены, и вам лучше вернуться к чертежной доске и придумать дизайн, который работает для вас.

0 голосов
/ 20 июля 2011

Хорошо, вот что не так с примерами кода:

где-то (не описано в вопросе), у вас есть фактическое объявление функции, и она имеет ошибку. Это выглядит так:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...