You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用CGAL的max_distance_to_triangle_mesh时make_range参数构造报错

CGAL max_distance_to_triangle_mesh 点范围参数构造编译错误解决

问题描述

使用CGAL库提供的max_distance_to_triangle_mesh函数时,第一个参数要求传入点类型的范围,多次尝试构造该参数均失败。
现有代码框架如下,替换????位置的内容多次均无法通过编译:

std::vector<Point> pts = ......;
double dist = PMP::max_distance_to_triangle_mesh(
  CGAL::make_range(
    boost::make_transform_iterator(
      pts.begin(), ????
    ),
    boost::make_transform_iterator(
      pts.end(), ????
    )
  ),
  mesh
);

目前仅找到一个相关示例,示例中存储的点为pair类型,????位置的转换函数通过Property_map_to_unary_function构造,尝试传入恒等函数未解决问题。
曾尝试编写如下lambda表达式作为转换函数:

auto get_pt = [](const Point &pt) {    
  return pt;    
}; 

将????替换为&get_pt后,编译过程中boost库抛出 no type named 'type' 错误。

解决方案

最简写法(推荐)

如果pts向量存储的元素本身就是Point类型,完全不需要额外套boost::make_transform_iterator做无意义的转换,直接传入向量的原生迭代器构造范围即可:

std::vector<Point> pts = ......;
double dist = PMP::max_distance_to_triangle_mesh(
  CGAL::make_range(pts.begin(), pts.end()),
  mesh
);

需要自定义转换的场景

如果存储的元素不是纯Point类型、必须做转换,不要自行编写裸lambda,使用CGAL内置的恒等函数对象替换????位置即可:

std::vector<Point> pts = ......;
double dist = PMP::max_distance_to_triangle_mesh(
  CGAL::make_range(
    boost::make_transform_iterator(
      pts.begin(), CGAL::Identity_functor<Point>()
    ),
    boost::make_transform_iterator(
      pts.end(), CGAL::Identity_functor<Point>()
    )
  ),
  mesh
);

之前lambda写法报错的核心原因:boost::make_transform_iterator依赖boost的result_of机制推导可调用对象的返回值,自行编写的lambda取地址传入后,该机制无法正确推导返回类型,就会抛出*no type named 'type'*的编译错误。


内容的提问来源于stack exchange,提问作者Stéphane Laurent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:03:33