CGAL5.6正则三角化插入带权点时locate函数报错求助
问题场景
将基于CGAL3.9的代码重构到5.6版本时,向正则三角化(Regular Triangulation)插入带权点时出现编译错误,插入函数代码如下:
Vertex_handle Scene::insert_vertex(const Point& point, const FT weight, const unsigned index) { Weighted_point wp(point, weight); Vertex_handle vertex = m_rt.insert(wp); // <-- 错误位置 if (vertex->get_index() != -1) return Vertex_handle(); vertex->set_index(index); return vertex; }
错误信息
编译时提示:insert(p)调用的locate(p, lt, li, start)函数无法匹配,存在locate函数但无法将const Weighted_point(即const CGAL::Weighted_point_2<CGAL::Epick>)转换为const Point&(即const CGAL::Point_2<CGAL::Epick>)。
环境说明
- 使用的Kernel:
CGAL::Exact_predicates_inexact_constructions_kernel - 自定义三角化类:
CTriangulation<Regular_triangulation>,其中Regular_triangulation为CGAL::Regular_triangulation_2<Kernel, TDS>(TDS为自定义顶点/面数据结构) - 原3.9代码使用已弃用的
CGAL::Regular_triangulation_filtered_traits_2<Kernel>定义带权点,现在改为Kernel::Weighted_point_2
修复方案
1. 确保基类insert重载被正确暴露
如果你的CTriangulation是继承自Regular_triangulation_2的自定义封装类,且类中定义了自己的insert函数(例如接受普通点的版本),会导致基类中接受带权点的insert重载被隐藏。需要在CTriangulation类中添加using声明,引入基类的所有insert重载:
template <typename RT> class CTriangulation : public RT { public: // 引入基类的所有insert重载,避免被自定义insert隐藏 using RT::insert; // ... 你的自定义成员函数和逻辑 };
2. 确认类型定义一致性
确保代码中使用的Weighted_point、Point、FT与正则三角化类中的类型完全一致,避免隐式转换问题:
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_2 Point; typedef Kernel::Weighted_point_2 Weighted_point; typedef Kernel::FT FT; // 正则三角化类型定义 typedef CGAL::Regular_triangulation_2<Kernel, YourCustomTDS> Regular_triangulation; typedef Regular_triangulation::Vertex_handle Vertex_handle;
3. 验证TDS与顶点定义正确性
自定义的TDS(三角化数据结构)中的顶点类,需要符合CGAL正则三角化的要求:
- 确保顶点类包含
Weighted_point类型的成员(或通过接口提供带权点数据) - 自定义的
get_index()和set_index()方法逻辑正确,默认构造时将index初始化为-1
关键版本差异说明
CGAL5.x中废弃了Regular_triangulation_filtered_traits_2,转而直接使用Kernel自带的traits(Kernel::Regular_triangulation_traits_2),该traits已经内置了正则三角化所需的所有谓词和构造函数,无需手动指定旧的filtered trait。此外,基类成员函数的重载规则在现代C++中更严格,需要显式引入基类重载以避免隐藏。
内容的提问来源于stack exchange,提问作者CharlineG

