Шаблонный класс C ++ Тип, передаваемый в качестве параметра в шаблонную функцию объекта - PullRequest
2 голосов
/ 14 июля 2011

Хорошо, я не знаю, имеет ли название смысл, поэтому я просто покажу код:

template <class S,class P,class A> class Task
{
  protected:

    timeval start;
    boost::ptr_vector<S> states;
    boost::ptr_vector<P> policies;
    Agent &robot;
    const ACTION_MODE &a_mode;
    A algo;

  public:

    Task(Agent &a, ACTION_MODE &m, A &alg) : robot(a), a_mode(m), algo(alg) {};
    P* findPolicy(S *state);
    bool stateExists(S *state);
    bool if_appendState(S *state);
    bool policyExists(P *policy);
    bool if_appendPolicy(P *policy);  
    void run();
};

Класс S - для состояний (полиморфный класс), класс P - для политик (шаблонный полиморфный класс), а класс A - для классов алгоритмов. Например (класс А - тип):

class SarsaTD
{
  protected:
    const float gamma;
    const float alpha;
    PTYPE method;
  public:
    SarsaTD(float a, float g) : alpha (a), gamma (g) {method = ON_POLICY; };
    template <typename P> void optimize(P *policy);
    PTYPE getType();
};

Я пытаюсь использовать из класса Task параметр P (policy) и переслать его в метод экземпляра SarsaTD.

template <class S,class P,class A> void Task<S,P,A>::run()
{
  S *state = new S(Task<S,P,A>::robot, const_cast<ACTION_MODE&>(Task<S,P,A>::a_mode));
  P *policy;
  if (Task<S,P,A>::if_appendState(state))
  {
    policy = new P(state);
    Task<S,P,A>::if_appendPolicy(policy);
  }
  else
  {
    policy = Task<S,P,A>::findPolicy(const_cast<S *>(state));
    policy->getValue();
    delete state;
  }

  Task<S,P,A>::algo.optimize<P>(policy);
  wb_robot_step(TIME_STEP);
}

Everythign работает нормально, до строки: Task<S,P,A>::algo.optimize<P>(policy); Где компилятор выдает следующую ошибку:

task.hpp:174: error: expected-primary expression before '>'token

Если я правильно понимаю, тип параметра P (policy), который я использую во всем классе шаблона, не может быть правильно перенаправлен в функцию шаблона? Или мой синтаксис неверен? Или то, что я пытаюсь сделать, просто не имеет смысла?

Ответы [ 2 ]

4 голосов
/ 14 июля 2011
Task<S,P,A>::algo.optimize<P>(policy);

В этот момент он не может знать, является ли optimize значением или нет. Вы поймете, если вы просто посмотрите на

Task<S,P,A>::algo.optimize < P

Это не только сравнение с вами, но и с компилятором. Даже если он затем продолжит синтаксический анализ, он не может знать, было ли ваше намерение сравнением или списком аргументов шаблона, если он полностью не создает экземпляр типа шаблона. Если вы ищете «зависимое имя» и «двухфазный поиск», вы найдете некоторую полезную информацию. Решением в вашем случае будет устранение неоднозначности вручную. Сообщите компилятору, что optimize - это шаблон:

Task<S,P,A>::algo.template optimize<P>(policy);
2 голосов
/ 14 июля 2011

Вы используете параметр шаблона в другой части выражения, попробуйте сделать:

Task<S, P, A>::algo.template optimize<P>(policy)

Это должно работать так.

...