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