无法使用模板错误编译nsgmls

时间:2011-11-26 03:22:32

标签: c++ templates typename

我是一个狂热的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_;                                                                                                                       
};

有人可以帮我解决这些错误吗?

1 个答案:

答案 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>基类,但令人困惑的是它给出的诊断反过来。

检查您的姓名并确保其类型存在。