简体   繁体   中英

C++ template compiler error

I'm updating some older Visual Studio C++ code and can't determine what is wrong with this code.

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);  
}

The error is:

 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 function def

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

You are passing two SPoint* to a function taking two PointerContainer::iterator . That's wrong unless PointerContainer::iterator is a typedef to SPoint* (it could reasonnably be, but I don't think it is in your case).

Most likely your code needs to be as such:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM