【问题标题】:Implicit template derivation for classes类的隐式模板派生
【发布时间】:2021-11-16 20:22:07
【问题描述】:

我有这门课:


template <typename T>
using VecBase = Eigen::MatrixBase<T>;

struct objective_QP 
{
private:
    const spMat Q;
    const spMat A;
    const Eigen::VectorXd b;
    const Eigen::VectorXd c;

public:

    template <typename V>
    objective_QP(const spMat& Q_, const VecBase<V> &c_): Q(Q_), c(c_)
    {}
    template <typename V>
    objective_QP(const spMat &Q_, const spMat& A_, const VecBase<V>& b_, const VecBase<V> &c_) : 
    Q(Q_), A(A_), b(b_), c(c_) {}


    template <typename V>
    inline scalar operator()(const VecBase<V> &x)
    {
        return (.5 * x.transpose() * Q * x + c.transpose() * x);
    }

    template <typename V>
    inline VecBase<V> Eval_grad(const VecBase<V> &x)
    {
        return Q.transpose() * x + c;
    }

    template <typename V>
    inline spMat Eval_hessian(const VecBase<V> &x)
    {
        return Q;
    }

    template <typename V>
    inline VecBase<V> Eval_c(const VecBase<V>& x)
    {
        return A*x-b;
    }

    template <typename V>
    inline spMat Eval_jac_c(const VecBase<V> & x)
    {        
        return A;
    }

};

当每个方法在类中被模板化时,它编译得很好,并且我能够在不指定维度的情况下构造objective_QP:

    objective_QP f(Q, c);

但是,当我将模板规范移到类之外时:

template <typename V>
struct objective_QP
{
private:
const spMat Q;
const spMat A;
const VecBase<V> b;
etc..

它严格要求指定类型V,所以我必须写:

objective_QP<V> f(Q, c);

应该可以从构造函数参数 c 派生 V。是否可以保留隐式派生并将模板规范移到类外?

【问题讨论】:

  • 您使用的是 C++17(所以使用 CTAD)? c 是什么?
  • Qc有哪些类型? (我猜你可能需要一个模板推导指南。)
  • Q 是 Eigen::Matrix,c 是 Eigen::Matrix
  • 我已经按照 eigen 给出的隐式推导示例:eigen.tuxfamily.org/dox/TopicTemplateKeyword.html
  • 发布的代码不完整(请参阅MCVE),但据我所知,您描述的设置与gcc.godbolt.org/z/3G9GWvvT7 相同,可以正常工作。也许这只是一个编译器标志问题(如提到的@Jarod42)

标签: c++ class templates


【解决方案1】:

使用 C++17 而不是 C++14 解决了这个问题,看起来像 为此,需要 Jarod42 指出的类模板参数推导 (CTAD)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多