C ++模板类作为参数转发到对象的模板函数

时间:2011-07-14 10:18:42

标签: c++ templates parameter-passing forwarding

好的,我不知道标题是否有意义,所以我只会展示代码:

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(策略)无法正确转发到模板函数中? 或者我的语法错了?或者我想做的事情根本没有意义?

2 个答案:

答案 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)

这应该是那样的。