【问题标题】:C++ template class Type being forwarded as parameter to object's template functionC++ 模板类类型作为参数转发给对象的模板函数
【发布时间】: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&lt;S,P,A&gt;::algo.optimize&lt;P&gt;(policy); 编译器给出以下错误的地方:

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

如果我理解正确,我在整个模板类中使用的参数类型 P(策略)不能正确地转发到模板函数中? 还是我的语法错误?或者我想要做的事情根本没有意义?

【问题讨论】:

  • 你还需要Task&lt;S,P,A&gt;::algo吗? algo 是 this 的成员变量,所以不应该只是 algo.optimize&lt;P&gt;(policy); 来解决问题吗?这也适用于您的其他调用。为什么a_mode 不是真正的 const 时却声明为 const?
  • 我也试过了,两者都是:this->algo.optimize

    (policy);和 algo.optimize

    (policy);我仍然得到完全相同的错误。

标签: c++ templates parameter-passing forwarding


【解决方案1】:
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);

【讨论】:

  • 天啊,谢谢你的工作。我不知道通过将模板类型作为参数传递会出现这样的问题。再次感谢您,我会查看依赖名称!
  • 如果您想要完整的参考资料,我会推荐 Vandevoorde/Josuttis “C++ 模板:完整指南”。我也只听说过 Dave Abrahams 的模板书,但我认为 Vandevoorde 更简洁。
  • 哦,womble.decadent.org.uk/c++/template-faq.html 上还有一些有价值的信息。
【解决方案2】:

您在表达式的另一部分使用模板参数,尝试这样做:

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

这应该像那样工作。

【讨论】:

  • 我已经尝试过了,我得到:task.hpp:175: error: expected unqualified-id before 'typename' task.hpp:175: error: expected ';'在'类型名'之前
  • 不应该是Task&lt;S, P, A&gt;::template algo.optimize&lt;P&gt;(policy)吗?
  • 我也试过了,它给出了完全相同的错误:expected-primary expression before '>'token
  • template 必须在该成员之前;)
  • 是的,就是这样!刚才糊涂了,不好意思。我更正我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2014-04-28
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多