编译错误:: vector :: iterator

时间:2013-10-25 20:31:38

标签: c++ sorting compilation

每当我编译我的prg时,我都会遇到这个错误。

c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:5394:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter)
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:5430:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<PointTwoD*, std::vector<PointTwoD> >, _Compare = bool (MissionPlan::*)(PointTwoD&, PointTwoD&)]
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:5430:5: note:   no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (MissionPlan::*)(PointTwoD&, PointTwoD&)'

下面实际上是我的.cpp文件..

bool MissionPlan::sortByCiv(const PointTwoD &t1, const PointTwoD &t2)
{
    return t1.locationdata.getCivIndex() < t2.locationdata.getCivIndex();
}

void MissionPlan::topfives()
{   

    topfive.assign( point1.begin(), point1.end() ); 

    sort(topfive.begin(), topfive.end(), sortByCiv);

    for(int i=0; i < 5; i++)
    {
        topfive.at(i).displayPointdata();
    }

}

missionplan.h

class MissionPlan
{

    private:
        int sizeofarray;
        int sizeofarray2;
        int xcordi;
        int ycordi;
        LocationData locationdata;
        PointTwoD pointtwoD;
        //MissionPlan missionplan;


    public:
        MissionPlan();
        MissionPlan(int, int, float);

        int getx();
        int gety();
        float civnum;
        float getciv();

        void stats();
        void storedata(int, int, float);
        void test();
        void displayall();
        void compute();
        void topfives();
        static bool sortByCiv(const PointTwoD &t1, const PointTwoD &t2);

};

当我从我的代码“sort(topfive.begin(),topfive.end(),sortByCiv)中删除此行时,我的程序将编译并顺利运行;”

那么这行代码是否存在问题,还是其他影响它的问题呢?


这是我在编写sortByCiv statc并将函数para更改为const后开始编译时获取的错误信息。

In file included from c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/algorithm:63:0,
                 from ..\src\/MissionPlan.h:9,
                 from ..\src\MissionPlanImp.cpp:3:
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h: In function '_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<PointTwoD*, std::vector<PointTwoD> >, _Tp = PointTwoD, _Compare = bool (*)(PointTwoD&, PointTwoD&)]':
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:2265:78:   instantiated from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<PointTwoD*, std::vector<PointTwoD> >, _Compare = bool (*)(PointTwoD&, PointTwoD&)]'
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:2306:62:   instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<PointTwoD*, std::vector<PointTwoD> >, _Size = int, _Compare = bool (*)(PointTwoD&, PointTwoD&)]'
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:5445:4:   instantiated from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<PointTwoD*, std::vector<PointTwoD> >, _Compare = bool (*)(PointTwoD&, PointTwoD&)]'
..\src\MissionPlanImp.cpp:140:48:   instantiated from here
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:2233:4: error: invalid initialization of reference of type 'PointTwoD&' from expression of type 'const PointTwoD'

c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / bits / stl_algo.h:2236:4:错误:无法初始化“PointTwoD&amp;”类型的引用来自'const PointTwoD'类型的表达式

现在最终程序在命令提示符下运行,但它终止时出现以下错误信息..

"terminate called after throwing an instance of 'std::out_of_range' what(): vecotr::_M_range_check"

谢谢你们,我得到了它并且正在运行,感谢并感谢所有人的帮助..

2 个答案:

答案 0 :(得分:5)

这里的问题是sortByCiv是一个成员函数,只能相对于某个接收者对象调用(即myObject.sortByCiv(...)sortByCiv(...)std::sort函数需要您可以将一些函数作为参数提供,该函数可以作为带有两个参数的自由函数调用,然后生成一个值。

要解决此问题,请制作sortByCiv static。这使得它不再具有接收器对象并且应该解决您的问题。

希望这有帮助!

答案 1 :(得分:0)

sortByCiv是成员函数,需要特殊处理;例如,你不能把它强制转换为函数指针类型,因为它有一个隐含的(第三个)this参数。

在你的情况下,你不需要。只需将sortByCiv(..)移出类声明(或使其成为静态),因为它不使用 this 参数:

bool sortByCiv(const PointTwoD &t1, const PointTwoD &t2)
{
    return t1.locationdata.getCivIndex() < t2.locationdata.getCivIndex();
}