我是一个狂热的emacs用户,并且想要使用sgml标记检查例程。 我自然而然地走向了nsgmls,并下载了源代码来编译它。
但是,编译器出现了一个奇怪的错误,包括以下内容。
./../include/RangeMap.h:57: error: type ‘Vector<RangeMapRange<From, To> >’ is not deri ved from type ‘RangeMapIter<From, To>’
./../include/RangeMap.h:57: error: expected ‘;’ before ‘ptr_’
./../include/RangeMap.h: In member function ‘Boolean RangeMapIter<From, To>::next(From&, From&, To&)’:
./../include/RangeMap.h:47: error: ‘ptr_’ was not declared in this scope
我知道有时候编译器会因模板和typename疯狂而感到不满,但是代码似乎已经在代码中正确使用了typename。
以下是引起这些错误的应对措施片段。
template<class From, class To>
class RangeMapIter {
public:
RangeMapIter(const RangeMap<From,To> &map);
Boolean next(From &fromMin, From &fromMax, To &toMin) {
if (!count_)
return 0;
else {
fromMin = ptr_->fromMin;
fromMax = ptr_->fromMax;
toMin = ptr_->toMin;
ptr_++;
count_--;
return 1;
}
}
private:
size_t count_;
typename Vector<RangeMapRange<From,To> >::const_iterator ptr_;
};
有人可以帮我解决这些错误吗?
答案 0 :(得分:0)
This error message is given by GCC in the wrong order of both type names.(但显然已在最新版本中修复此问题)。这意味着Vector<RangeMapRange<From,To> >::const_iterator
未被发现是类型名称。此诊断的根本原因是代码被解析为 access-declaration ,其语法如下
::[opt] nested-name-specifier template[opt] unqualified-id ;
该语法的一个例子
struct A {
int a;
};
struct B : A {
// equivalent to: using A::a;
A::a;
};
在C ++ 11中,这个 access-declaration 结构已从规范中删除,并在C ++ 03中弃用。但由于编译器仍然支持解析它,当找不到Vector<RangeMapRange<From,To> >::const_iterator
类型时,它将被视为在 access-declaration 中声明的名称(因此解析器)在类型说明符部分向前移动)。因此根据上面的语法,在 unqualified-id 之后,在这种情况下是const_iterator
(在我的例子中是a
),它想要看到一个分号,它希望Vector<RangeMapRange<From, To> >
是RangeMapIter<From, To>
的基类,但令人困惑的是它给出的诊断反过来。
检查您的姓名并确保其类型存在。