我使用带有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。我已经为我的世界中所有合理类型添加了这些类型,int
,long
,bmp::mpz_int
,bmp::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扩展中添加另一部分代码,以使我的自定义类型与* =和/ =完美匹配?