好的,我不知道标题是否有意义,所以我只会展示代码:
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用于算法类。 例如(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(策略)并将其转发到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(策略)无法正确转发到模板函数中? 或者我的语法错了?或者我想做的事情根本没有意义?
答案 0 :(得分:4)
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);
答案 1 :(得分:2)
您在表达式的另一部分中使用模板参数,尝试执行以下操作:
Task<S, P, A>::algo.template optimize<P>(policy)
这应该是那样的。