我有这样的代码
namespace bg = boost::geometry;
typedef typename std::conditional<highDimension,
typename bg::model::point<double, 6, bg::cs::cartesian>,
typename bg::model::point<double, 5, bg::cs::cartesian>>::type point;
..........
point p;
p.set<0>(0);
p.set<1>(0);
p.set<2>(0);
..........
GCC向我展示了很多错误,例如“错误:类型'的无效操作数'和'int'到二进制'运算符<'p.set <1>(col.a());”所以它只是试图'比较'p.set
和1
boost类实际上有模板函数集,但编译器不使用它作为函数。
如果我直接从boost类型生成typedef,就像typedef bg::model::point<double, 5, bg::cs::cartesian> point;
一切正常。
我只想根据模板参数highDimension
选择不同的尺寸大小。但现在我不知道如何强迫GCC了解我:)
由于highDimension
是一个模板参数,point
成为一个依赖类型,所以你需要在这里写template
:
p.template set<0>(0);
至于为什么你需要template
,请在这里阅读答案:
顺便说一下,你在论证中不需要typename
:
typedef typename std::conditional<highDimension,
bg::model::point<double, 6, bg::cs::cartesian>,
bg::model::point<double, 5, bg::cs::cartesian>>::type point;
你也可以使用using
:
using point = typename std::conditional<highDimension,
bg::model::point<double, 6, bg::cs::cartesian>,
bg::model::point<double, 5, bg::cs::cartesian>>::type;
从可读性的角度来看,这看起来更好(恕我直言)。
或者你可以简单地写这个:
using point = bg::model::point<double, highDimension?6:5, bg::cs::cartesian>;
看起来更好。