我有这个课:

template <class S, class P, class A>
class Task
{
  private:

    timeval start;
    boost::ptr_vector<S> states;
    boost::ptr_vector<P> policies;

  public:

    P findPolicy(S *state);
    S findState(S *state);

};

当我尝试使用迭代器定义findPolicy或findState时:
template <class S, class P, class A>
S Task<S,P,A>::findState(S *state)
{
  boost::ptr_vector<S>::iterator it;
  for ( it = policies.begin(); it < policies.end(); ++it)
  {
    // blah
  }
}

在类之后定义,编译器说:
error: expected ';' before it;

即使尝试在类声明中定义函数也会给我同样的错误。
我很困惑,因为到目前为止这就是我一直在使用boost::ptr_vector迭代器的方式。
似乎可行的唯一方法是老式的老式方法:
for (int i = 0; i < policies.size(); i++)
  {
    if (policies[i].getState() == state)
    {
     return policies[i];
    }
  }

我想念什么?

最佳答案

  boost::ptr_vector<S>::iterator it;

这需要使用C++关键字typename:
typename boost::ptr_vector<S>::iterator it;

否则,C++不知道ptr_vector<S>::iterator应该是什么。这是因为ptr_vector<S>的定义取决于模板参数S,并且在模板定义时S的值未知。但是编译器需要能够在不知道ptr_vector<S>::iterator确切含义的情况下理解S行。

因此,编译器假定从属名称是变量(所以是ptr_vector<S>的静态成员);您需要使用typename来告诉编译器从属名称是类型而不是变量。

07-24 09:45
查看更多