【发布时间】:2011-07-14 10:18:41
【问题描述】:
好吧,我不知道标题是否有意义,所以我将代码显示:
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);
}
一切正常,直到这条线:Task<S,P,A>::algo.optimize<P>(policy);
编译器给出以下错误的地方:
task.hpp:174: error: expected-primary expression before '>'token
如果我理解正确,我在整个模板类中使用的参数类型 P(策略)不能正确地转发到模板函数中? 还是我的语法错误?或者我想要做的事情根本没有意义?
【问题讨论】:
-
你还需要
Task<S,P,A>::algo吗?algo是this的成员变量,所以不应该只是algo.optimize<P>(policy);来解决问题吗?这也适用于您的其他调用。为什么a_mode不是真正的 const 时却声明为 const? -
我也试过了,两者都是:this->algo.optimize
(policy);和 algo.optimize
(policy);我仍然得到完全相同的错误。
标签: c++ templates parameter-passing forwarding