2011-11-26 123 views
0

我是一個狂熱的emacs用戶,並希望使用sgml標記檢查例程。 我自然是朝着nsgmls的方向前進,並將源代碼降級以編譯它。無法編譯與模板錯誤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 

我知道,有些時候編譯器得到由模板類型名瘋狂不滿,然而碼似乎已經正確使用內碼類型名稱。

以下是引起這些錯誤的應對片段。

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

爲什麼不去'onsgmls'(OpenSP的一部分)?我認爲這是最近的... –

回答

0

This error message is given by GCC in the wrong order of both type names.(但它顯然在最新版本中修復了這個問題)。這意味着Vector<RangeMapRange<From,To> >::const_iterator未被發現是類型名稱。此診斷的根本原因是,代碼被解析爲訪問聲明,其具有下面的語法

::[opt] nested-name-specifier template[opt] unqualified-id ; 

struct A { 
    int a; 
}; 

struct B : A { 
    // equivalent to: using A::a; 
    A::a; 
}; 

該語法的一個例子。在C++ 11這訪問聲明構造被取消了規範,並且它在C++ 03中被棄用。但由於編譯器仍然支持解析它,因此當Vector<RangeMapRange<From,To> >::const_iterator未被發現是一種類型時,它將被視爲在訪問聲明中聲明的名稱(因此解析器向前跨越類型說明符部分)。因此,根據上述語法,所述不合格-ID在這種情況下是const_iterator後(在我的例子是a),它希望看到一個分號和它想要的是Vector<RangeMapRange<From, To> >基類的RangeMapIter<From, To>,但令人困惑的是,它所提供的診斷方式卻反其道而行之。

檢查你的名字,並確保類型存在。