我有这个课:
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
来告诉编译器从属名称是类型而不是变量。