带有模板函数错误的C ++条件模板类型

时间:2014-02-07 13:47:29

标签: c++ templates gcc boost boost-geometry

我有这样的代码

    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'到二元'运算符&lt;'       p.set&lt; 1&gt;(col.a());“所以它只是尝试'比较'p.set1

boost类确实有模板函数集,但编译器不使用它作为函数。

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

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

1 个答案:

答案 0 :(得分: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>;

看起来更好。