2016-04-02 1 views
0

Я попытался создать базовый класс итератора следующим образом:C2676 Ошибка в VC2012 и C2784 в VC2005: reverse_iterator для отображения шаблонных классов

template < typename object > 
class IteratorBase : public IteratorInterface 
{ 
protected: 
    map<int, object> *objectMap; 
    //typedef map<int, typename object> objectmap; 
    typename map<int, typename object, less<int>, allocator<pair<const int, typename object>>>::reverse_iterator rit; 

    //typedef typename objectmap::reverse_iterator riterator; 
    //riterator rit; 
    //typename objectmap::iterator it; 
    typename map<int, typename object, less<int>, allocator<pair<const int, typename object>>>::iterator it; 

    UINT32 limit; 
    UINT32 start; 
    UINT32 count; 
    bool reverse; 
public: 
    ~IteratorBase() 
    { 
     objectMap = 0; 
    } 

    object *begin() 
    { 
     if(objectMap->size()==0) 
      return 0; 

     count = 0; 

     int i=0; 
     if(reverse) 
     { 
      for(rit = objectMap->rbegin(); rit!=objectMap->rend() && i<start; i++, rit++); 

      if(rit == objectMap->rend()) 
       return 0; 

      return &(rit->second); 
     } 
     else 
     { 
      for(it = objectMap->begin(); it!=objectMap->end() && i<start; i++, it++); 

      if(it == objectMap->end()) 
       return 0; 

      return &(it->second); 
     } 
    } 

    object *next() 
    { 
     ++ count; 
     if(limit) 
      if(count>limit) 
       return 0; 

     if(reverse) 
     { 
      ++ rit; 
      if(rit == objectMap->rend()) 
       return 0; 

      return &rit->second; 
     } 
     else 
     { 
      ++ it; 
      if(it == objectMap->end()) 
       return 0; 

      return &it->second; 
     } 
    } 


    object *getAt(int x, int *pos=0) 
    { 
     if(objectMap->size()==0) 
      return 0; 

     count = 0; 

     int i=0; 

     if(reverse) 
     { 
      map<int, object>::reverse_iterator itt; 

      for(itt = objectMap->rbegin(); itt!=objectMap->rend() && i<start+x; i++, itt++); 

      if(itt == objectMap->rend()) 
       return 0; 

      if(pos) 
       *pos = i; 

      return &itt->second; 
     } 
     else 
     { 
      map<int, object>::iterator itt; 

      for(itt = objectMap->begin(); itt!=objectMap->end() && i<start+x; i++, itt++); 

      if(itt == objectMap->end()) 
       return 0; 

      if(pos) 
       *pos = i; 

      return &itt->second; 
     } 
    } 

}; 

Но есть ошибка, что я не знаю, как исправить :

1>c:\program files (x86)\microsoft visual studio 8\vc\include\xutility(1809) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const std::_Tree<_Traits>::iterator' 
1>  with 
1>  [ 
1>   _Traits=std::_Tmap_traits<int,TestDataItemEx,std::less<int>,std::allocator<std::pair<const int,TestDataItemEx>>,false> 
1>  ] 
1>  c:\program files (x86)\microsoft visual studio 8\vc\include\xutility(1856) : see declaration of 'std::operator -' 
1>  c:\program files (x86)\microsoft visual studio 8\vc\include\xutility(1808) : while compiling class template member function 'std::reverse_iterator<_RanIt> std::reverse_iterator<_RanIt>::operator +(__w64 int) const' 
1>  with 
1>  [ 
1>   _RanIt=std::_Tree<std::_Tmap_traits<int,TestDataItemEx,std::less<int>,std::allocator<std::pair<const int,TestDataItemEx>>,false>>::iterator 
1>  ] 
1>  h:\test.140108\test\app1\Testapp.h(510) : see reference to class template instantiation 'std::reverse_iterator<_RanIt>' being compiled 
1>  with 
1>  [ 
1>   _RanIt=std::_Tree<std::_Tmap_traits<int,TestDataItemEx,std::less<int>,std::allocator<std::pair<const int,TestDataItemEx>>,false>>::iterator 
1>  ] 
1>  h:\test.140108\test\app1\Testapp.h(714) : see reference to class template instantiation 'IteratorBase<object>' being compiled 
1>  with 
1>  [ 
1>   object=TestDataItemEx 
1>  ] 

ч: \ test.140108 \ Test \ app1 \ Testapp.h (510):

typename map<int, typename object, less<int>, allocator<pair<const int, typename object>>>::reverse_iterator rit; 

ч: \ test.140108 \ Test \ app1 \ теста pp.h (714):

class TestDataItemExIterator : public IteratorBase<struct TestDataItemEx> 

.

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(985): error C2676: binary '-=' : 'std::_Tree_iterator<_Mytree>' does not define this operator or a conversion to a type acceptable to the predefined operator 
1>   with 
1>   [ 
1>    _Mytree=std::_Tree_val<std::_Tree_simple_types<std::pair<const int,TestDataItemEx>>> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(984) : while compiling class template member function 'std::_Revranit<_RanIt,_Base> &std::_Revranit<_RanIt,_Base>::operator +=(__w64 int)' 
1>   with 
1>   [ 
1>    _RanIt=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const int,TestDataItemEx>>>>, 
1>    _Base=std::iterator<std::bidirectional_iterator_tag,std::pair<const int,TestDataItemEx>,__w64 int,std::pair<const int,TestDataItemEx> *,std::pair<const int,TestDataItemEx> &> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(1194) : see reference to function template instantiation 'std::_Revranit<_RanIt,_Base> &std::_Revranit<_RanIt,_Base>::operator +=(__w64 int)' being compiled 
1>   with 
1>   [ 
1>    _RanIt=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const int,TestDataItemEx>>>>, 
1>    _Base=std::iterator<std::bidirectional_iterator_tag,std::pair<const int,TestDataItemEx>,__w64 int,std::pair<const int,TestDataItemEx> *,std::pair<const int,TestDataItemEx> &> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(1124) : see reference to class template instantiation 'std::_Revranit<_RanIt,_Base>' being compiled 
1>   with 
1>   [ 
1>    _RanIt=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const int,TestDataItemEx>>>>, 
1>    _Base=std::iterator<std::bidirectional_iterator_tag,std::pair<const int,TestDataItemEx>,__w64 int,std::pair<const int,TestDataItemEx> *,std::pair<const int,TestDataItemEx> &> 
1>   ] 
1>   h:\test.140108\test\app1\Testapp.h(510) : see reference to class template instantiation 'std::reverse_iterator<_RanIt>' being compiled 
1>   with 
1>   [ 
1>    _RanIt=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const int,TestDataItemEx>>>> 
1>   ] 
1>   h:\test.140108\test\app1\Testapp.h(714) : see reference to class template instantiation 'IteratorBase<object>' being compiled 
1>   with 
1>   [ 
1>    object=TestDataItemEx 
1>   ] 

Не могли бы вы мне помочь.

Thanks

+0

Где-то код пытается вычислить разницу между двумя обратными итераторами. Это работает только в том случае, если базовый итератор является итератором с произвольным доступом. На карте нет такого итератора. –

+0

Спасибо Бо, вычислите разницу между двумя итераторами с обратной стороны, это не то, что я хочу. Как предотвратить выполнение этого кода? Я имею в виду, есть ли какой-либо метод, который может использовать обратный итератор для карты для любого объекта структуры, определенного шаблоном без ошибки синтаксического анализа? –

ответ

1

Я нашел его. Это ошибка Microsoft Visual Studio для 2005 и 2012 годов, не знаю, влияет ли это на другие версии. Сообщает об ошибке компиляции в неправильном месте. Реальная ошибка была в следующем фрагменте кода:

class TestDataItemExIterator : public IteratorBase<struct TestDataItemEx> 
{ 
    ... 
}; 

void main() 
{ 
    map<int, TestDataItemEx> objectMap; 

    map<int, TestDataItemEx>::reverse_iterator it=objectMap.rbegin(); 

    if((it+1) != objectMap.rend()) // Here is the error location. 
    { 
     int i=1; 
    } 
} 

Однако сообщение об ошибке показывает другое место, что стоило мне 2 дня, чтобы найти реальную проблему место в прошлом. :-)

0

Эта проблема возникла в VS2015.
решаемый его, как показано ниже:

изменен с:

*(c1.end()-1) 

к:

it = c1.end(); 
it--; 
Смежные вопросы