同样一段使用std:sort的代码,vc可以编译通过,gcc出错,有关问题在哪里
同样一段使用std::sort的代码,vc可以编译通过,gcc出错,问题在哪里
在g++在使用g++ -c convex_hull.cpp(文件名) 提示如下错误
convex_hull.cpp: In member function `void ConvexHull::convert_order_points(std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> >&)':
convex_hull.cpp:35: error: no matching function for call to `sort(__gnu_cxx::__normal_iterator<ConvexHull::MyPoint*, std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> > >, __gnu_cxx::__normal_iterator<ConvexHull::MyPoint*, std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> > >, ConvexHull::convert_order_points(std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> >&)::sort_func&)'
而在vc下连个警告都没有,直接成功,是什么原因,sort函数的参数在两种编译器或者是运行库中不一致么?
1>正在编译...
1>convex_hull.cpp
1>生成日志保存在“file://h:\TEMP\opengl_es\opengl_es\Debug\BuildLog.htm”
1>opengl_es - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
------解决方案--------------------
试了一下,可能是低版本gcc对局部类支持的有问题。GCC4.7版能编译过去
将
- C/C++ code
void ConvexHull::convert_order_points(std::vector<MyPoint>& points) { if (m_points.size() < 3) return; class sort_func { public: bool operator()(const MyPoint& p1, const MyPoint& p2) { return p1.y < p2.y || (p1.y == p2.y && p1.x < p2.x); } } cmp_func; std::vector<MyPoint> temp_points = m_points; std::sort(temp_points.begin(), temp_points.end(), cmp_func); points.push_back(temp_points[0]); points.push_back(temp_points[1]); int top = 1; for(int i = 2; i < (int)temp_points.size(); i++) { while(top && !ral(points[top], points[top - 1], temp_points[i])) top--; points[++top] = temp_points[i]; } }
在g++在使用g++ -c convex_hull.cpp(文件名) 提示如下错误
convex_hull.cpp: In member function `void ConvexHull::convert_order_points(std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> >&)':
convex_hull.cpp:35: error: no matching function for call to `sort(__gnu_cxx::__normal_iterator<ConvexHull::MyPoint*, std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> > >, __gnu_cxx::__normal_iterator<ConvexHull::MyPoint*, std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> > >, ConvexHull::convert_order_points(std::vector<ConvexHull::MyPoint, std::allocator<ConvexHull::MyPoint> >&)::sort_func&)'
而在vc下连个警告都没有,直接成功,是什么原因,sort函数的参数在两种编译器或者是运行库中不一致么?
1>正在编译...
1>convex_hull.cpp
1>生成日志保存在“file://h:\TEMP\opengl_es\opengl_es\Debug\BuildLog.htm”
1>opengl_es - 0 个错误,0 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
------解决方案--------------------
试了一下,可能是低版本gcc对局部类支持的有问题。GCC4.7版能编译过去
将
- C/C++ code
class sort_func { public: bool operator()(const MyPoint& p1, const MyPoint& p2) { return p1.y < p2.y || (p1.y == p2.y && p1.x < p2.x); } } cmp_func;
------解决方案--------------------
C++98、C++03标准中局部自定义类型不能实例化模版的问题,C++11中已解决。
可以改用支持C++11标准的g++(一般默认-std参数或者指明-std=c++11即可,如若-std=c++98或-std-c++03则不可)解决,也可将class sort_func类型的定义改为全局的。
------解决方案--------------------