2012-09-04 114 views
0

我正在更新一些較舊的Visual Studio C++代碼,並且無法確定此代碼出現了什麼問題。C++模板編譯器錯誤

TLineApproximator<T>::PointContainer::iterator TDPHull<typename T>::DP(typename PointContainer::iterator it, typename PointContainer::iterator jt) 
{ 
    static double ld, rd, len_sq; 
    static SHomog l; 
    register SPoint *le; 
    register SPoint *re; 

    SPoint* i=&(*it); 
    SPoint* j=&(*jt); 

    SPoint::CrossProduct(*i, *j, l); 
    len_sq = l.x * l.x + l.y * l.y; 

    if (j - i < 8) 
    {  /* chain small */ 
     rd = 0.0; 
     for (le = i + 1; le < j; le++) 
     { 
      ld = SPoint::DotProduct(*le, l); 
      if (ld < 0) ld = - ld; 
      if (ld > rd) 
      { 
       rd = ld; 
       re = le; 
      } 
     } 
     if (rd * rd > GetTol() * len_sq) 
     { 
      OutputVertex(DP(i, re)); 
      return(DP(re, j)); 
     } 
     else 
      return(j); 
    } 
    else 
    {    /* chain large */ 
     int sbase, sbrk, mid, lo, m1, brk, m2, hi; 
     double d1, d2; 
     if ((m_phLeft.GetTop() - m_phLeft.GetBot()) > 8) 
     { 
      /* left hull large */ 
      lo = m_phLeft.GetBot(); 
      hi = m_phLeft.GetTop() - 1; 
      sbase = m_phLeft.SlopeSign(hi, lo, l); 
      do 
      { 
       brk = (lo + hi)/2; 
       if (sbase == (sbrk = m_phLeft.SlopeSign(brk, brk+1, l))) 
        if (sbase == (m_phLeft.SlopeSign(lo, brk+1, l))) 
         lo = brk + 1; 
        else 
         hi = brk; 
      } 
      while (sbase == sbrk && lo < hi); 

      m1 = brk; 
      while (lo < m1) 
      { 
       mid = (lo + m1)/2; 
       if (sbase == (m_phLeft.SlopeSign(mid, mid+1, l))) 
        lo = mid + 1; 
       else 
        m1 = mid; 
      } 

      m2 = brk; 
      while (m2 < hi) 
      { 
       mid = (m2 + hi)/2; 
       if (sbase == (m_phLeft.SlopeSign(mid, mid+1, l))) 
        hi = mid; 
       else 
        m2 = mid + 1; 
      }; 


      if ((d1 = SPoint::DotProduct(*m_phLeft.GetpElt(lo), l)) < 0) d1 = - d1; 
      if ((d2 = SPoint::DotProduct(*m_phLeft.GetpElt(m2), l)) < 0) d2 = - d2; 
      ld = (d1 > d2 ? (le = m_phLeft.GetpElt(lo), d1) : (le = m_phLeft.GetpElt(m2), d2)); 
     } 
     else 
     {   /* Few SPoints in left hull */ 
      ld = 0.0; 
      for (mid = m_phLeft.GetBot(); mid < m_phLeft.GetTop(); mid++) 
      { 
       if ((d1 = SPoint::DotProduct(*m_phLeft.GetpElt(mid), l)) < 0) d1 = - d1; 
       if (d1 > ld) 
       { 
        ld = d1; 
        le = m_phLeft.GetpElt(mid); 
       } 
      } 
     } 

     if ((m_phRight.GetTop() - m_phRight.GetBot()) > 8) 
     {   /* right hull large */ 
      lo = m_phRight.GetBot(); hi = m_phRight.GetTop() - 1; 
      sbase = m_phRight.SlopeSign(hi, lo, l); 
      do 
      { 
       brk = (lo + hi)/2; 
       if (sbase == (sbrk = m_phRight.SlopeSign(brk, brk+1, l))) 
        if (sbase == (m_phRight.SlopeSign(lo, brk+1, l))) 
         lo = brk + 1; 
        else 
         hi = brk; 
      } 
      while (sbase == sbrk && lo < hi); 

      m1 = brk; 
      while (lo < m1) 
      { 
       mid = (lo + m1)/2; 
       if (sbase == (m_phRight.SlopeSign(mid, mid+1, l))) 
        lo = mid + 1; 
       else 
        m1 = mid; 
      } 

      m2 = brk; 
      while (m2 < hi) 
      { 
       mid = (m2 + hi)/2; 
       if (sbase == (m_phRight.SlopeSign(mid, mid+1, l))) 
        hi = mid; 
       else 
        m2 = mid + 1; 
      }; 

      if ((d1 = SPoint::DotProduct(*m_phRight.GetpElt(lo), l)) < 0) d1 = - d1; 
      if ((d2 = SPoint::DotProduct(*m_phRight.GetpElt(m2), l)) < 0) d2 = - d2; 
      rd = (d1 > d2 ? (re = m_phRight.GetpElt(lo), d1) : (re = m_phRight.GetpElt(m2), d2)); 
     } 
     else 
     {   /* Few SPoints in righthull */ 
      rd = 0.0; 
      for (mid = m_phRight.GetBot(); mid < m_phRight.GetTop(); mid++) 
      { 
       if ((d1 = SPoint::DotProduct(*m_phRight.GetpElt(mid), l)) < 0) d1 = - d1; 
       if (d1 > rd) 
       { 
        rd = d1; 
        re = m_phRight.GetpElt(mid); 
       } 
      } 
     } 
    } 


    if (ld > rd) 
     if (ld * ld > GetTol() * len_sq) 
     {    /* split left */ 
      register int tmpo; 

      while ((m_phLeft.GetHp() >= 0) 
       && ((tmpo = m_phLeft.GetpOp()[m_phLeft.GetHp()]), 
       ((re = m_phLeft.GetpHelt(m_phLeft.GetHp())) != le) || (tmpo != TPathHull<T>::StackPushOp))) 
      { 
       m_phLeft.DownHp(); 
       switch (tmpo) 
       { 
       case TPathHull<T>::StackPushOp: 
        m_phLeft.DownTop(); 
        m_phLeft.UpBot(); 
        break; 
       case TPathHull<T>::StackTopOp: 
        m_phLeft.UpTop(); 
        m_phLeft.SetTopElt(re); 
        break; 
       case TPathHull<T>::StackBotOp: 
        m_phLeft.DownBot(); 
        m_phLeft.SetBotElt(re); 
        break; 
       } 
      } 

      Build(i, le); 
      OutputVertex(DP(i, le)); 
      Build(le, j); 
      return DP(le, j); 
     } 
     else 
      return(j); 
     else    /* extreme on right */ 
      if (rd * rd > GetTol() * len_sq) 
      {    /* split right or both */ 
       if (m_pPHtag == re) 
        Build(i, re); 
       else 
       {   /* split right */ 
        register int tmpo; 

        while ((m_phRight.GetHp() >= 0) 
         && ((tmpo = m_phRight.GetpOp()[m_phRight.GetHp()]), 
         ((le = m_phRight.GetpHelt(m_phRight.GetHp())) != re) || (tmpo != TPathHull<T>::StackPushOp))) 
        { 
         m_phRight.DownHp(); 
         switch (tmpo) 
         { 
         case TPathHull<T>::StackPushOp: 
          m_phRight.DownTop(); 
          m_phRight.UpBot(); 
          break; 
         case TPathHull<T>::StackTopOp: 
          m_phRight.UpTop(); 
          m_phRight.SetTopElt(le); 
          break; 
         case TPathHull<T>::StackBotOp: 
          m_phRight.DownBot(); 
          m_phRight.SetBotElt(le); 
          break; 
         } 
        } 
       } 
       OutputVertex(DP(i, re)); 
       Build(re, j); 
       return(DP(re, j)); 
      } 
      else 
       return(j); 
} 

的錯誤是:

dphull.h(155) : error C2664: 'hull::TDPHull<T>::DP' : cannot convert 
parameter 1 from 'hull::TLineApproximator<T>::SPoint *' to 
'std::_Vector_iterator<_Ty,_Alloc>' 
     with 
     [ 
      T=double 
     ] 
     and 
     [ 
      T=double 
     ] 
     and 
     [ 
      _Ty=hull::TLineApproximator<double>::SPoint, 
      _Alloc=std::allocator<hull::TLineApproximator<double>::SPoint> 
     ] 
     No constructor could take the source type, or constructor overload resolution was ambiguous dphull.h(128) : while compiling 
class template member function 'std::_Vector_iterator<_Ty,_Alloc> 
hull::TDPHull<T>::DP(std::_Vector_iterator<_Ty,_Alloc>,std::_Vector_iterator<_Ty,_Alloc>)' 
     with 
     [ 
      _Ty=hull::TLineApproximator<double>::SPoint, 
      _Alloc=std::allocator<hull::TLineApproximator<double>::SPoint>, 
      T=double 
     ] 
     d:\src\inc`lude\`pglline2dlod.h(127) : see reference to class template instantiation 'hull::TDPHull<T>' being compiled 
     with 
     [ 
      T=double 
     ] 

SPoint* i=&(*it); 

DP功能高清

template <class T> 
typename TLineApproximator<T>::PointContainer::iterator TDPHull<typename T>::DP(typename PointContainer::iterator it, typename PointContainer::iterator jt) 
+0

功能需要一個'向量 :: iterator'和你傳遞一個'SPOINT *' - 什麼困惑嗎?你爲什麼期望這個工作? – ildjarn

+0

你改變了編譯器或標準庫嗎?它可能是在一個以前的實現'std :: vector :: iterator'是一個'T *'但不再是。 –

+0

是的,從舊的Visual Studio 2003中移出 –

回答

1

你傳遞兩個SPoint*到以兩個PointerContainer::iterator的功能。這是錯誤的,除非PointerContainer::iteratortypedefSPoint*(它可能是合理的,但我認爲它不是你的情況)。

最有可能你的代碼需要這樣:

OutputVertex(DP(it, [an iterator, maybe jt ?])); 
+0

typedef std :: vector PointContainer; –

+0

你可以重寫'DP'來取2'SPoint *',這可能會更容易。 –