【问题标题】:c++ passing non-templated eigen vector as function argument and modifying it in the functionc ++将非模板化特征向量作为函数参数传递并在函数中对其进行修改
【发布时间】:2013-07-16 15:02:38
【问题描述】:

我正在实现派生类的函数成员(在基类中声明为虚拟)。其中一个参数是 vectorXd,它是存储操作结果的位置。

我阅读了“以特征类型为参数编写函数”(http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html),他们的 hack 依赖于模板函数,将通用 Eigen 对象作为可能的参数。就我而言,我认为它不会起作用,因为您似乎无法混合使用虚拟和模板。

另一方面,我知道我的参数将始终是 VectorXd 类型,我什至可以在进入函数之前将其调整到正确的大小,这样就无需在函数内部调整大小。我正在尝试通过引用将向量作为 const 传递并使用 const_cast 进行所需修改的方法,但仍然出现链接错误:

错误 LNK2001: 无法解析的外部符号“public: virtual void __thiscall problem::f(class method *,class Eigen::Matrix const &,class Eigen::Matrix const &)” (?f@problem@@UAEXPAVmethod@ @ABV?$Matrix@N$0?0$00$0A@$0?0$00@Eigen@@1@Z)

这里,“问题”是基类,“f”是函数,“方法”是另一个类(我的函数中也需要该类型的对象)。

在问题的定义中我有:

virtual void f(method *m, const Eigen::VectorXd &x, Eigen::VectorXd const &y);

在派生的定义中:问题我有:

void f(method *m, const Eigen::VectorXd &x, Eigen::VectorXd const &y) {...};

'y' 是我需要存储结果的地方。关于如何实现这一目标的任何建议? 提前致谢。

【问题讨论】:

    标签: c++ parameter-passing eigen3


    【解决方案1】:

    如果您的基类是抽象的,请将方法设置为=0 并为纯virtual

    如果基类不是抽象的,它可能不需要那个方法。不要将它包含在基类中。

    如果基类不是抽象的,但您需要能够对基类的每个实例以及派生类执行该操作,则需要在基类和派生类中实现该函数。

    【讨论】:

    • 谢谢,我错过了“=0”。我使用派生类来实现 f,但我在调用 f 的函数中传递了一个指向基类的指针。
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-11-15
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多