1.9 KiB
1.9 KiB
id, status, severity, category, date, updated, reporter, related
| id | status | severity | category | date | updated | reporter | related |
|---|---|---|---|---|---|---|---|
| VDE-016 | fixed | high | bug | 2026-07-27 | 2026-07-28 | ViewDesign | VDE-001, VDE-005, VDE-010 |
VDE-016: ssi_boolean.cpp 两阶段名称查找修正不完整
问题描述
v1.0.2 添加了 #include <algorithm>,但仍无法通过 GCC 编译。根本原因是 匿名命名空间 在 GCC 两阶段查找下不能被外部引用。
剩余编译错误
error: 'SSICurveData' was not declared in this scope
(it is in vde::brep::{anonymous}::SSICurveData)
error: 'begin' was not declared in this scope
error: 'end' was not declared in this scope
(GCC needs #include <iterator>, MSVC pulls it transitively)
error: 'ClassResult' was not declared in this scope
(should be vde::brep::ClassResult; MSVC allows unqualified lookup)
根因分析
-
SSICurveData — 定义在
vde::brep命名空间的匿名 namespace 中。匿名 namespace 内的类型在翻译单元外部不可见。GCC 严格执行两阶段查找时,放在匿名 namespace 中的类型在其他函数中找不到。解决方案:将struct SSICurveData移出匿名 namespace,放到显式的namespace vde::brep中。 -
begin/end — GCC 不会通过
<algorithm>传递引入std::begin/std::end,需要显式#include <iterator>。 -
ClassResult — 需要
using vde::brep::ClassResult;(MSVC 允许隐式查找,GCC 不允许)。
当前 Workaround
ViewDesign 排除 vde_brep 及其依赖(vde_mesh, vde_boolean, vde_sdf, vde_capi)。
建议修复
// ssi_boolean.cpp
// 1. 将 ssi_boolean.cpp 中的匿名命名空间改为显式命名空间:
// BEFORE: namespace { struct SSICurveData { ... }; }
// AFTER: namespace vde::brep { struct SSICurveData { ... }; }
// using namespace vde::brep; // 保持当前代码无需修改
// 2. 添加 #include <iterator>
// 3. 添加 using vde::brep::ClassResult;