Eigen

时间:2015-10-15 16:19:20

标签: c++ eigen eigen3

我正在尝试将自定义转换运算符写入Eigen::Matrix2d对象,但我失败了。下面是剥离到骨头的代码:

#include <iostream>
#include <Eigen/Dense>

struct MatrixView
{
    operator Eigen::Matrix2d() const // conversion operator
    {
        Eigen::Matrix2d tmp;
        std::cout << "CONVERSION TRIGERRED\n";
        return tmp; 
    }
};

int main()
{
    MatrixView m;
    static_cast<Eigen::Matrix2d>(m);
}

我得到一个讨厌的编译时错误,这里列出的时间太长了,从以下开始:

  

错误:没有匹配函数来调用'Eigen :: Matrix :: _ init1(const MatrixView&amp;)'

     

注意:无法将'x'(类型'const MatrixView')转换为'Eigen :: Index {aka long int}'          Base :: template _init1(x);          Base :: template _init1(x);

您可以找到完整的错误消息here

我不知道发生了什么,转换操作符很简单,只是返回默认初始化的Eigen::Matrix2d。有什么想法吗?

修改

如果我删除“explicit”,则转换由复制初始化触发,如

Eigen::Matrix2d tmp = m; // OK without "explicit"

然而static_cast仍然失败。

平台详细信息:

OS X 10.10 Yosemite,Eigen 3.2.6,g ++(MacPorts gcc5 5.2.0_0)5.2.0,Apple LLVM 7.0.0版(clang-700.0.72)目标:x86_64-apple-darwin14.5.0,两者都失败编译代码。

编辑2

实际上发生了整个问题,因为我的链接指向了Eigen_3.3_alpha1的开发者版本。在Eigen 3.2.x中它可以工作。感谢@Matt提示!我会结束这个问题。

1 个答案:

答案 0 :(得分:2)

Eigen有定期生成的开发包。根据Drop中的建议,评论显示了如何检查包含哪个版本。在9月4日发布的alpha中有一个返回版本3.2.91。使用10月1日发布的版本3.2.6可以正确编译。代码显示的版本是:

#include <Eigen\src\Core\util\Macros.h> 
#include <iostream>
...
std::cout << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << 
    EIGEN_MINOR_VERSION << "\n";