无法编译CGAL官方示例代码:struct CGAL::Default无size_type类型错误
解决CGAL编译错误:
no type named ‘size_type’ in ‘struct CGAL::Default’ 你在使用Ubuntu 16.04自带的旧版本CGAL(通过apt安装的libcgal-dev)编译约束三角剖分代码时遇到了模板参数的问题,这个错误的根源在于旧版本CGAL对Triangulation_2的模板参数要求更严格。
错误原因分析
你代码中使用了CGAL::Default作为Constrained_Delaunay_triangulation_2的第二个模板参数(三角剖分数据结构),但在当前的CGAL版本中,CGAL::Default并没有定义size_type类型——而这个类型是Triangulation_2内部实现所必需的。新版本CGAL可能已经修复了这个问题,允许Default自动推导合适的类型,但旧版本需要显式指定数据结构类型。
解决方案:显式指定三角剖分数据结构
修改你的模板类型定义,把CGAL::Default替换为显式的Triangulation_data_structure_2类型,具体步骤如下:
- 先定义顶点基类、约束面基类,再组合成三角剖分数据结构:
#include <CGAL/Constrained_triangulation_plus_2.h> #include <CGAL/Constrained_Delaunay_triangulation_2.h> #include <CGAL/Epeck.h> // 定义顶点和约束面基类 typedef CGAL::Epeck K; typedef CGAL::Triangulation_vertex_base_2<K> Vb; typedef CGAL::Constrained_triangulation_face_base_2<K> Fb; typedef CGAL::Triangulation_data_structure_2<Vb, Fb> Tds; // 使用显式的Tds代替CGAL::Default typedef CGAL::Constrained_Delaunay_triangulation_2<K, Tds, CGAL::Exact_intersections_tag> CDT; typedef CGAL::Constrained_triangulation_plus_2<CDT> CT;
- 确保编译命令链接CGAL依赖的数学库:
旧版本CGAL依赖GMP和MPFR库,所以编译时需要加上链接参数:
g++ apply.cpp -lCGAL -lgmp -lmpfr -I/usr/local/include -o a.out
额外说明
如果你后续有机会升级CGAL版本(比如从源码编译安装最新版),这个问题会自动消失,因为新版本的CGAL::Default已经可以正确推导Triangulation_data_structure_2的类型。但在Ubuntu 16.04的旧环境下,显式指定数据结构是最直接的解决办法。
内容的提问来源于stack exchange,提问作者Jader Martins




