Невозможно скомпилировать nsgmls с ошибкой шаблона - PullRequest
0 голосов
/ 26 ноября 2011

Я заядлый пользователь 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

Я знаю, что иногда компилятору не нравятся безумие по шаблонам и типам, но коды, похоже, уже правильно использовали тип кода в коде.

Вот фрагменты кода, которые вызывают эти ошибки.

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 голосов
/ 28 ноября 2011

Это сообщение об ошибке выдается GCC в неправильном порядке имен обоих типов. (но, очевидно, это исправлено в последней версии). Предполагается, что 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 не будет определен как тип, он будет принят за имя, которое будет объявлено в заявлении о доступе (поэтому анализатор перемещается вперед раздел спецификатора типа). Следовательно, согласно приведенному выше синтаксису, после безусловного идентификатора , который в данном случае равен const_iterator (а в моем примере это a), он хочет видеть точку с запятой и хочет, чтобы Vector<RangeMapRange<From, To> > это базовый класс из RangeMapIter<From, To>, но сбивающая с толку диагностика имеет его наоборот.

Проверьте ваши имена и убедитесь, что тип существует.

...