Хорошо, я не знаю, имеет ли название смысл, поэтому я просто покажу код:
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), который я использую во всем классе шаблона, не может быть правильно перенаправлен в функцию шаблона?
Или мой синтаксис неверен? Или то, что я пытаюсь сделать, просто не имеет смысла?