2

我有这样一段代码

    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' 类型的无效操作数到二进制 'operator<' p.set<1>(col.a());” 所以它只是尝试“比较”p.set1

boost 类确实有模板函数集,但编译器不将其用作函数。

如果我直接从 boost 类型制作 typedef,就像typedef bg::model::point<double, 5, bg::cs::cartesian> point;一切正常。

我只想根据模板参数选择不同的尺寸highDimension。但现在我不知道如何强迫 GCC 理解我:)

4

1 回答 1

5

既然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>;

看起来更好。

于 2014-02-07T13:53:23.080 回答