自定义类型Matrix * = Eigen中的int

时间:2017-04-18 16:21:33

标签: c++ eigen

我使用带有Eigen的自定义复杂类型。这种类型是Boost.Multiprecision的mpfr_float类型的包装器。 MPFR在我的使用中是一个堆分配类型(变量精度),因此临时的非常昂贵。因此,我的所有构造函数都标记为explicit

我有一个测试用例来检查使用某些操作的编译,这是一个当前失败的操作,如下所示:

BOOST_AUTO_TEST_CASE(self_multiplication_mpfr_int)
{
    using T = bertini::mpfr_complex;
    T q(1);
    int a(1);

    Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> A(2,2);
    A << T(2), T(1), T(1), T(2);

    A*=a; // this line fails to compile
}

我为Eigen提供了许多扩展,最重要的是这篇帖子

namespace eigen{ namespace internal{
template<> 
struct scalar_product_traits<int,bertini::complex> 
{
    enum { Defined = 1 };
    typedef bertini::complex ReturnType;
};

template<> 
struct scalar_product_traits<bertini::complex, int> 
{
    enum { Defined = 1 };
    typedef bertini::complex ReturnType;
};
}} // namespaces 

有关此scalar_product_traits的详细信息,请参阅https://forum.kde.org/viewtopic.php?f=74&t=111176。我已经为我的世界中所有合理类型添加了这些类型,intlongbmp::mpz_intbmp::mpfr_float(相应的实际类型)等。

我的编译器错误(OSX上的clang)看起来像

test/library_compatibility/eigen.cpp:478:4: error: no viable overloaded '*='
            A*=a;
            ~^ ~
/Users/ofloveandhate/code/eigen/Eigen/src/Core/DenseBase.h:388:14: note: candidate function not viable: no known conversion from 'int' to 'const Scalar' (aka 'const bertini::complex') for 1st argument
Derived& operator*=(const Scalar& other);
         ^
/Users/ofloveandhate/code/eigen/Eigen/src/Core/MatrixBase.h:183:14: note: candidate template ignored: could not match 'EigenBase<type-parameter-0-0>' against 'int'
Derived& operator*=(const EigenBase<OtherDerived>& other);
         ^

我觉得MWE在这里包含的时间太长了,所以相反,如果有必要,我可以将你推荐给我的回购。我的Eigen版本是3.3,rev 10428。

我的问题是: 这是一个特征性的东西,还是我需要在我的Eigen扩展中添加另一部分代码,以使我的自定义类型与* =和/ =完美匹配?

0 个答案:

没有答案